2017-07-19 75 views
-1

我想僅打印包含組數最少的行。我的文件包含多個列,我使用第一列來確定組。假設第1行,第4行,第6行在同一組中,因爲第一列的內容相同。我的目標是在每個組的第二列中打印出包含最少編號的行。打印行中包含最少數量的組 - AWK/SED/PERL

file.txt的:

VDDA 0.7 .... 
VDDB 0.2 .... 
VDDB 0.3 .... 
VDDA 0.4 .... 
VSS 0.1 .... 
VDDA 0.2 .... 
VSS 0.2 .... 

output.txt中:

VDDA 0.2 .... 
VDDB 0.2 .... 
VSS 0.1 .... 

我想我可以用一個for循環和比較做這個工作有C,但我覺得有一個更好的辦法使用AWK/SED/PERL。

+0

如果您不關心訂單,並且'-u'可用,則可以使用'sort'輕鬆完成此操作(教程:http://www.skorks.com/2010/05/sort-files-like- a-master-with-the-linux-sort-command-bash /)...無論如何你必須顯示你的努力來解決這個問題..而sed'絕對不可取 – Sundeep

回答

1

如果您不打擾Input_file的第一個字段的順序,那麼下面的內容也可以幫助您。此外,此代碼將爲任何第一個字段查找最小數字值,然後打印它。

awk '{a[$1]=a[$1]>$2?$2:(a[$1]?a[$1]:$2)} END{for(i in a){print i,a[i]}}' Input_file 

EDIT1:如果你想在同一順序輸出$ 1的,那麼下面可以幫助你在相同的了。

awk '!a[$1]{b[++i]=$1} {c[$1]=a[$1]>$2?$0:(c[$1]?c[$1]:$0);a[$1]=a[$1]>$2?$2:(a[$1]?a[$1]:$2);} END{for(j=1;j<=i;j++){print b[j],c[b[j]]}}' Input_file 
+0

謝謝你分享你的碼。我認爲EDIT1可能有錯誤。我得到了「a [:未找到事件」。此外,第一個代碼只生成第一列和第二列,但我想打印整行。 –

+0

現在請檢查EDIT1,它會爲您提供完整的產品線,讓我知道它是如何去做的。 – RavinderSingh13

+0

謝謝。更新的EDIT1完美工作。 –

0

隨着GNU datamash工具:

假設包含行下面的示例性輸入文件具有5列:

VDDA 0.7 c1 2 a 
VDDB 0.2 c2 3 b 
VDDB 0.3 c4 5 c 
VDDA 0.4 c5 6 d 
VSS 0.1 c6 7 e 
VDDA 0.2 c7 8 f 
VSS 0.2 c8 9 g 

datamash -sWf -g1 min 2 < file | awk '{--NF}1' 

輸出:

VDDA 0.2 c7 8 f 
VDDB 0.2 c2 3 b 
VSS 0.1 c6 7 e 
1
$ awk '{split(a[$1],s);a[$1]=(s[2]<$2 && s[2])?a[$1]:$0} END{for(i in a)print a[i]}' file.txt 
VDDA 0.2 .... 
VDDB 0.2 .... 
VSS 0.1 .... 

簡要說明:

  • 保存$0a[$1]
  • split(a[$1],s):從a[$1]分裂數字s[2]因爲如果條件s[2]<$2 && s[2]滿足比較
  • ,設置a[$1]=a[$1],否則設置a[$1]=$0