打印所有但在awk中选择字段

Ste*_*edy 14 bash awk

我有一个包含数百列的大文件,我只想删除第三列和第四列,并将其余列打印到文件中.我最初的想法是制作一个类似的awk脚本awk '{print $1, $2, for (i=$5; i <= NF; i++) print $i }' file > outfile.但是,此代码不起作用.

然后我尝试了:

awk '{for(i = 1; i<=NF; i++)
if(i == 3 || i == 4) continue
else
print($i)}' file > outfile
Run Code Online (Sandbox Code Playgroud)

但这只是在一个领域打印出来的.将它分成两个脚本并将它们与unix结合起来是可能的,paste但这似乎应该可以在一行中完成.

Car*_*rum 16

你的第一次尝试非常接近.修改它以使用printf并包括字段分隔符对我有用:

awk '{printf $1FS$2; for (i=5; i <= NF; i++) printf FS$i; print NL }'
Run Code Online (Sandbox Code Playgroud)

  • NL不是awk的任何标准功能(在我有权访问的4个实现中的任何一个上都不是非标准功能).它只是一个常规变量,在这里未初始化.`print NL`最终打印换行符,因为它被解释为'print'"`.`print sjskjsdsj`会有相同的结果. (3认同)

tho*_*rca 9

怎么样的:

cat SOURCEFILE | cut -f1-2,5- >> DESTFILE
Run Code Online (Sandbox Code Playgroud)

它打印前两列,跳过第3列和第4列,然后从5开始打印到结尾.


mat*_*hew 7

假设您有一个制表符分隔文件,如下所示:

TEMP.TXT

field1 field2 field3 field4 field5 field6
field1 field2 field3 field4 field5 field6
field1 field2 field3 field4 field5 field6

运行以下命令将删除字段3和4并输出到行尾.

awk '{print $1"\t"$2"\t"substr($0, index($0,$5))}' temp.txt

field1 field2 field5 field6
field1 field2 field5 field6
field1 field2 field5 field6

我的例子打印到stdout. > newFile将stdout发送到newFile >> newFile并将附加到newFile.

所以你可能想要使用以下内容:

awk '{print $1"\t"$2"\t"substr($0, index($0,$5))}' temp.txt > newFile.txt

有些人会争辩要削减

cut -f1,2,5- temp.txt

它产生相同的输出,并且cut非常简单,但不处理不一致的分隔符.例如,不同空格的混合.但是,在这种情况下,切割可能就是你所追求的.

你也可以在perl,python,ruby和许多其他人中完成这个,但这是最简单的awk解决方案.


小智 6

如何将第三列和第四列设置为空字符串:

echo 1 2 3 4 5 6 7 8 9 10 |
awk -F" " '{ $3="";  $4=""; print}'
Run Code Online (Sandbox Code Playgroud)

  • 但是你仍然坚持使用分隔符:`echo 1:2:3:4:5:6:7:8:9:10 | awk -F: 'BEGIN{OFS=FS} { $3=""; $4=""; 打印}'` (5认同)