簡體   English   中英

如何在AWK中一次刪除多個列和字段分隔符?

[英]How to remove several columns and the field separators at once in AWK?

我有一個包含數千列的大文件。 我想在Bash中使用AWK一次刪除一些特定的列和字段分隔符。

我可以使用此oneliner一次刪除一列(第3列將被刪除,其對應的字段分隔符):

awk -vkf=3 -vFS="\t" -vOFS="\t" '{for(i=kf; i<NF;i++){ $i=$(i+1);}; NF--; print}' < Big_File

但是,我想一次刪除幾個列...有人可以幫我解決這個問題嗎?

您可以將要從shell中刪除的列的列表傳遞給awk如下所示:

awk -vkf="3,5,11" ...

然后在awk程序中將其解析為數組:

split(kf,kf_array,",")

然后通過所有列並測試每個特定列是否在kf_array中並可能跳過它

其他可能性是多次打電話給你的oneliner :-)

以下是卡米爾的想法的實現:

awk -v remove="3,8,5" '
  BEGIN {
    OFS=FS="\t"
    split(remove,a,",")
    for (i in a) b[a[i]]=1
  }                                                          
  {
    j=1
    for (i=1;i<=NF;++i) {
      if (!(i in b)) { 
        $j=$i
        ++j
      }
    }
    NF=j-1
    print
  }
'

如果你可以使用cut而不是awk ,這個更容易cut

例如,這會從文件中獲取列1,3和50:

cut -f1,3,50- file

這樣的事情應該有效:

awk -F'\t' -v remove='3|8|5' '
{
   rec=ofs=""
   for (i=1;i<=NF;i++) {
      if (i !~ "^(" remove ")$" ) {
         rec = rec ofs $i
         ofs = FS
      }
   }
   print rec
}
' file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM