从Linux中的分隔文件中删除一列

我有以下格式的文件:

col1|col2|col3|col4 a|b|c|d e|f||h i|j|k|l 

我想从头文件和数据中删除col3(用分隔符“|”)。 这可以使用awk / sed来完成吗?

请注意,col3中的数据可能为空(第2行)。

输出应该是:

 col1|col2|col4 a|b|d e|f|h i|j|l 

Solutions Collecting From Web of "从Linux中的分隔文件中删除一列"

你可以简单地使用cut

 cut -d'|' -f1-2,4- file 

这可能适用于你(GNU sed):

 sed 's/[^|]*|//3' file 
 awk 'BEGIN{FS=OFS="|"}{print $1,$2,$4}' file 

应该给你输出。

这是非常基本的awk用法。

编辑

你没有提到70列… 🙁

尝试这个:

 awk -F'|' '{s="";for(i=1;i<=NF;i++){f=(NF==i)?"":FS;if(i!=3)s=s $if;}print s}' file 

这是一个可能的sed解决方案:

 sed -i.bak filename -e 's;\(^.*|.*|\).*|\(.*\);\1\2;' 

这对你的例子来说很好用,可以对其他例子进行调整,但不是真正的通用解决方案。

说明:

-i.bak编辑文件,首先进行名为filename.bak的备份。

\(^.*|.*|\)从行首开始,匹配包括第二个分隔符在内的所有内容。 这个匹配的括号组(组1)。

.*| 匹配一切,包括最后的分隔符。

\(.*\)匹配其余和组(组2)。

\1\2将所有以前的匹配项替换为组1和组2中的文本。

使用cut是正确的答案,但是如果你真的想使用awk ,比Kent显示的更容易:

 awk -F'|' 'BEGIN {OFS="|"} {for (n=3; n < NF; ++n) $n = $(n+1); --NF; print}' 

$3后,只要洗牌,然后通过改变NF的值来改变字段的数量。

另一个awk解决方案可能会有用,如果你有很多列

 awk -F'|' '{$3="";$0=$0;$3=$3}1' FPAT='[^|]+' OFS='|' file 

削减指挥将有助于实现这一目标

  cat filname | cut -d'|' -f1,2,4