[英]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.