混乱を矯正しなさい! [閉鎖]

混乱を矯正しなさい! [閉鎖]

これはファイルの内容を含む中括弧の問題です。

one one one

two two two

three 098234

one one one

two two two

three 098234

one one one

two two two

three 098234 ...

awk '{ a[NR]=$0 } END {b=0; for (i=1;i<=NR;i++) { b++; printf "%s",a[i]; if(b==3) {print"";b=0;}}}' file

出力:

one one onetwo two twothree 098234

four four fourfive five fivesix 092834
 ...

3行を接続し、改行を追加してください!

これが機能しても、校正器の必要性や配置が正しく理解されていません。ここで中かっこを使用して同じ結果を得る別の方法はありますか?同様の例をたくさん見ましたが、そのどれも私が望む結果を得ませんでした。

私の質問が正しいかどうかはわかりませんが、簡単な方法はありますか?経験則校正器に。ありがとう

ベストアンサー1

awkあなたの声明は明示的な改行でよりよく理解されるかもしれません

awk '
         { a[NR]=$0 }    # Applies to every line of input

    END  {               # Executed once, when there is no more data
             b=0;
             for (i=1;i<=NR;i++) {
                 b++;
                 printf "%s",a[i];
                 if (b==3) {
                     print"";
                     b=0;
                 }
             }
         }
' file

3行のデータをすべてリンクする必要があるという要件によれば、これは処理を実行する前にファイル全体を読み取るため、非常に非効率的なコードのように見えます。

これを試してみてください。一度に3行だけバッファリングされます。

awk '{s=s $0} NR>1&&!((NR)%3) {print s;s=""}' data

広げるとこんな感じ

awk '
                    { s=s $0 }           # Append this line to the buffer
    NR>1 && !(NR%3) { print s; s="" }    # Print the buffer every three lines
' data

最初の行の式は、(NR%3)3行目ごとに0に達します。これを無効にして、3行目ごとにコンポーネントのみを!トリガーします。{...}

おすすめ記事