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

时间:2011-06-23 17:49:08

标签: bash awk

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

然后我尝试了:

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

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

6 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:9)

如下:

cat SOURCEFILE | cut -f1-2,5- >> DESTFILE

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

答案 2 :(得分:6)

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

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解决方案。

答案 3 :(得分:2)

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

echo 1 2 3 4 5 6 7 8 9 10 |
awk -F" " '{ $3="";  $4=""; print}'

答案 4 :(得分:2)

是的,可以将第三列和第四列设置为空字符串;但是,另外,字段$1应设置为自身($1=$1),以使awk实际消耗整个当前行上的输入字段分隔符(分隔符): { {1}}一气呵成。

$0

答案 5 :(得分:0)

艰难但通用的方式(忘记一个简单的oneliner)

awk -v "Exclude=3:4:5" '
   # load exclusion
   BEGIN{
      Count=split(Exclude, aTmp, ":")
      for( i = 1; i <= Count; i++) aExc[ aTmp[ i]]=1
      }

   # treat each line, taking only wanted field
   {
    Result=""
    for( i = 1; i <= NF; i++) {
       # field to take ?
       if( ! aExc[ i]) {
         # first element or add a separator before
         if( Result != "") Result=Result OFS $i
          else Result=$i
         }
       }

    print Result
   }' YourFile
  • 您可以指定要排除的任何字段
    • 以第一行:分隔的可变排除填写字段索引
  • 分隔符的数量正确
  • 代码被“扩展”以便更好地理解
  • 最终结果不完全是输入(没有排除字段),因为使用输出分隔符而不是原始分隔符(ex 2空格或选项卡更改为1空格并具有默认行为)