2013-01-09 43 views
0

我有一個文本文件,其中包含字段1中的可變長度鍵字段和字段2中的其他數據。字段之間用製表符分隔(「 \ t「)。關鍵字段包含空格。該文件在關鍵字段上排序。在Unix中提取重複字段的記錄(不使用uniq!)

我想過濾這個創建一個只包含重複鍵字段(即字段1)的記錄的文件,以及用空行分隔記錄組的附加好處。

例如

01001|XYZ ZY|\tFOO MAN CHU\n 
01001|XYZ ZY|\tBAR BAZ\n 

01001|ZZZYYYXX|\tYACKETY YACK\n 
01001|ZZZYYYXX|\tBOBBITY BOP\n 
01001|ZZZYYYXX|\tTESTING TESTING\n 

...等等。換句話說,如果uniq -d -D爲備用字段分隔符或可變長度字段提供了任何選項,它會執行什麼操作!

有什麼方法可以在使用現成的Unix過濾器的命令中完成此操作嗎?

+2

使用'awk'及其設置變量的能力,對它們進行比較,等($ 0是整個當前行,NR是當前的行號,$ 1 ... $ n是當前字段(忽略分隔符,您也可以更改輸入和輸出)等) –

回答

0

嘗試AWK爲奧利弗表明,如果在Solaris上使用NAWK代替:

awk -F ' ' '{arr[$1]++; next} 
       END{for(i in arr) 
        {if(arr[i]>1) {print i}} } ' infile > keyfile 

awk -F ' ' 'FILENAME=="keyfile" {arr[$1]=1;next} 
       FILENAME=="infile" 
        {if($1 in arr){print $0}} ' keyfile infile > newfile 

這可以縮短但對於一個awk新手更加混亂。 -F''< - 在''之間有一個製表符。

awk -F ' ' 'NR==FNR {arr[$1]++; next}         
       (NR>FNR && arr[$1]>1) {print} ' infile infile > newfile 

厲害瞭解版本