11〜21列に基づいてテキストファイルから重複エントリを削除するシェルスクリプトをどのように取得できますか?
サンプルファイル:
Header:0000000000000001457854500000
XP 12345678912yeyeyeyeeye 0000003
XP 12345678913yeyeyeyeeye 0000002
XP 12345678912yeyeyeyeeye 0000004
XP 12345678913yeyeyeyeeye 0000001
Footer:0000000000000001245856500004
予想出力:
Header:0000000000000001457854500000
XP 12345678913yeyeyeyeeye 0000001
Xp 12345678912yeyeyeyeeye 0000004
Footer:0000000000000001245856500001
答え1
予想される出力に応じて、次のようになります。
awk 'NF <= 1 || !seen[substr($0, 11, 11)]++'
または
awk 'NF <= 1 || !seen[substr($2, 1, 11)]++'
または、最後の記録を維持します。
awk '!second_pass {if (NF > 1) count[substr($2, 1, 11)]++; next}
NF <= 1 || --count[substr($2, 1, 11)] == 0' file second_pass=1 file
答え2
コマンド: header=
sed -n '1p' l.txt ; footer=
sed -n '$p' l.txt;sed -e '1d' -e '$d' l.txt |awk '{if (!seen[$2]++)print $0}'| sed '1i '$header''| sed '$s/.*/&\n'$footer'/g'
出力
header=`sed -n '1p' l.txt`; footer=`sed -n '$p' l.txt`;sed -e '1d' -e '$d' l.txt |awk '{if (!seen[$2]++)print $0}'| sed '1i '$header''| sed '$s/.*/&\n'$footer'/g'
Header:0000000000000001457854500000
XP 12345678912yeyeyeyeeye 0000003
XP 12345678913yeyeyeyeeye 0000002
Footer:0000000000000001245856500004