標準入力全体に標準入力の最後の行を追加します。

標準入力全体に標準入力の最後の行を追加します。

次のスクリプトを考えてみましょう。

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

これは入力全体をメモリに読み込むため、例えばギガバイト)入力。

おすすめ記事