次のスクリプトを考えてみましょう。
tmpfile=$(mktemp)
cat <<EOS > "$tmpfile"
line 1
line 2
line 3
EOS
cat <(tail -1 "$tmpfile") "$tmpfile"
これは働き、出力されます:
line 3
line 1
line 2
line 3
入力ソースが実際のファイルではなく標準入力であるとします。
cat <<EOS | # what goes here now?
line 1
line 2
line 3
EOS
コマンドを修正するには:
cat <(tail -1 "$tmpfile") "$tmpfile"
それでは、他の状況でも同じ出力が生成されますか?
メモ:私が使用している特定のHeredocとHeredoc自体の使用は単なる例です。許容される回答は次のとおりです。stdin経由で任意のデータを受信する。
ベストアンサー1
努力する:
awk '{x=x $0 ORS}; END{printf "%s", $0 ORS x}'
はい
入力として変数を定義します。
$ input="line 1
> line 2
> line 3"
次のコマンドを実行してください。
$ echo "$input" | awk '{x=x $0 ORS}; END{printf "%s", $0 ORS x}'
line 3
line 1
line 2
line 3
もちろんhere-docを使うこともできます。
$ cat <<EOS | awk '{x=x $0 ORS}; END{printf "%s", $0 ORS x}'
line 1
line 2
line 3
EOS
line 3
line 1
line 2
line 3
どのように動作しますか?
x=x $0 ORS
これにより、入力の各行が変数に追加されます
x
。まったく
ORS
そうではありません。出力レコード区切り記号。デフォルトでは改行文字です。END{printf "%s", $0 ORS x}
ファイル全体を読み取った後、最後の行が印刷され、
$0
その後にファイル全体の内容が印刷されますx
。
これは入力全体をメモリに読み込むため、例えばギガバイト)入力。