これはファイルの内容を含む中括弧の問題です。
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行目ごとにコンポーネントのみを!
トリガーします。{...}