awk - $1 列が前の $1 列と等しくない場合は、前の行全体を印刷します。

awk - $1 列が前の $1 列と等しくない場合は、前の行全体を印刷します。

最初の列の文字列が前の行の最初の列の文字列と異なる場合は、前の行全体を印刷する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

おすすめ記事