簡體   English   中英

awk-僅打印重復的第一行及其下一行

[英]awk - print only first line of duplicates and the line below it

我有一個較大的數據庫文件,需要進行一些操作。 本質上,我需要避免以“ |”分隔的重復字段一 對於:

-- TITLE1 | TITLE2   |T3   |TITLE4|TITLE5 
----------|----------|-----|------|---------------
--
DATA1   | SAME     |     |      |  blah blah
ELIGIBLE  | x1 
DATA1   | SAME     |     | blah |  blah
ELIGIBLE  | x2 
DATA1   | SAME     |     | blah |  blah blah
ELIGIBLE  | x2 
DATA2   | SAME     |     |      |  blah blah
ELIGIBLE  | y1 
DATA2   | SAME     |     | blah |  blah
ELIGIBLE  | y2
DATA2   | SAME     |     | blah |  blah blah blah blah
ELIGIBLE  | y2
DATA3   | SAME     |     |      |  blah blah
ELIGIBLE  | z1
DATA3   | SAME     |     | blah |  blah
ELIGIBLE  | z2
DATA3   | SAME     |     | blah |  blah blah blah blah
ELIGIBLE  | z2

我正在使用的代碼是

BEGIN{ FS = "|" }
{
count[$1]++;
if (count[$1] == 1)
first [$1] = $0;
if (count[$1] > 1)
print first[$1]
NR==1;
}

但這給了我輸出:

-- TITLE1 | TITLE2   |T3   |TITLE4|TITLE5 
----------|----------|-----|------|---------------
--
DATA1   | SAME     |     |      |  blah blah
ELIGIBLE  | x1 
DATA2   | SAME     |     |      |  blah blah
DATA3   | SAME     |     |      |  blah blah

我希望這樣的輸出:

-- TITLE1 | TITLE2   |T3   |TITLE4|TITLE5 
----------|----------|-----|------|---------------
--
DATA1   | SAME     |     |      |  blah blah
ELIGIBLE  | x1 
DATA2   | SAME     |     |      |  blah blah
ELIGIBLE  | y1 
DATA3   | SAME     |     |      |  blah blah
ELIGIBLE  | z1 

我不太在乎標題欄,但需要它來顯示概述的數據。 很抱歉業余的解釋,但對解決方案的任何幫助將不勝感激。 我是Linux命令行腳本的新手,所以如果有人能解釋我的答案錯誤的原因,我將不勝感激。 我不僅限於awk,並且可以使用任何命令解決方案。 我只是想嘗試用awk解決方案。

您可以嘗試以下方法:

awk -F\| '(printed!=0 && /ELIGIBLE/) {print; printed=0;} (!seen[$1] && $1 !~ /ELIGIBLE/) { print; printed = 1; seen[$1] = 1;  }' 

盡管幾乎可以肯定有更好的方法。

埃塔:有一個很好的awk中的教程這里和各地的網絡幾個人,有一些好書一起。 但基本上,awk程序是一系列模式和代碼塊,可在與該模式匹配的每條記錄(默認情況下為行)上運行。

awk '/foo/          { do this for lines that contain "foo" anywhere }
     ($1 == "bar")  { do this for lines whose first field is exactly "bar' }
     ($NF ~ /baz/)  { do this for lines whose last field contains "baz" }
     (NF == 1)      { do this for lines with exactly one field }
     (NR == 10)     { do this only on the 10th line }'

如果沒有模式,則該塊在每一行上運行。

awk '{print $NF}'   # print the last field of every line

如果沒有塊,只有一個模式,那么匹配的行將不變地打印:

awk '/foo/'      # same as grep foo

在處理任何輸入之前,將運行標記為BEGIN的塊。 處理完所有輸入后,將運行一個標記為END的塊。

awk 'BEGIN { t = 0 } {t += $NF} END { print t }'   # print total of last column 

但實際上未初始化的變量在算術中被視為0,因此您可以跳過初始化:

awk '{t += $NF} END {print t}'

有些版本的awk需要用分號; 或圖案/塊對之間的換行符

此行適用於您的給定示例。 (數據已排序,oneline數據,oneline合格...)。如果格式更改,則不能保證為您的真實數據工作。 您必須自己進行測試。

標題/標題被跳過。

awk -F'|' '!(NR%2){next}$1 in a{next}{print;a[$1];getline;print}' file

試試吧:

kent$  awk -F'|' '!(NR%2){next}$1 in a{next}{print;a[$1];getline;print}' file
DATA1   | SAME     |     |      |  blah blah
ELIGIBLE  | x1 
DATA2   | SAME     |     |      |  blah blah
ELIGIBLE  | y1 
DATA3   | SAME     |     |      |  blah blah
ELIGIBLE  | z1

暫無
暫無

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

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