最初の列の文字列が前の行の最初の列の文字列と異なる場合は、前の行全体を印刷するawkプログラムをLinuxで作成しようとしています。
別のアプローチは、最初の列が同じであるときはいつでも、一致する列の最後の行全体を印刷し、以前の同じ列を削除することです。
私は次のコードを使用しました。
awk 'BEGIN { FS=OFS=";" } $1==last{next} {last=$1} {print last}' test.txt
しかし、前の行の最初の列だけを印刷していると思います。前の行全体を印刷するには?
私の入力ファイルはtest.txt
次のとおりです。
818522;"Joey";
817399;"john";
817399;"CCE";
817399;"smith";
817399;"Ron";
817400;
817400;
817400;
818000;"ODC";
890021;
890021;
890021;"rachel";
890021;"monica"
希望の出力:
818522;"Joey";
817399;"Ron";
817400;
818000;"ODC";
890021;"monica"
ベストアンサー1
あなたの説明が出力と一致しないため、少し混乱しています。あなたの説明によると、予想される出力は次のとおりです。
818522;"Joey";
817399;"Ron";
817400;
818000;"ODC";
890021
最後の行なので、どの行も印刷しないので、最初のフィールドは次の行と変わりません。これが本当に欲しいものなら、次のようにすることができます。
$ awk -F';' '{
if($1!=last && prevLine){ print prevLine }
{ last=$1; prevLine=$0 }
}' file
818522;"Joey";
817399;"Ron";
817400;
818000;"ODC";
最後の行にも例外を追加するには、以下を試してください。
$ awk -F';' '{
if($1!=last && prevLine){
print prevLine;
lastPrinted=last
}
{
last=$1;
prevLine=$0
}
}
END{
if($1 != lastPrinted){ print }
}' file
818522;"Joey";
817399;"Ron";
817400;
818000;"ODC";
890021;"monica"
last
アイデアはとても簡単です。最初のフィールドが定義された変数と異なる場合prevLine
(最初の行を印刷しない)、前の行(prevLine
)を印刷し、前の行の最初のフィールド(last
)を変数に保存します。lastPrinted
。
次に、すべての行に対してlast
最初のフィールドとprevLine
現在の行を設定します。最後に、ファイルの終わりに達すると(END{}
)行の最初のフィールドが最後に印刷した最初のフィールド()と異なる場合は、その行を印刷しますlastPrinted
。