これは何をしますか?
( awk '{ if (NR > 1) print prev " " $1; prev = $1; }' file)
答え1
それはawk
スクリプトです。awkはプログラミング言語ですフィールドで区切られたデータを処理するのに特に適しています。スクリプト自体は非常に簡単です。
if (NR > 1)
:現在の入力行の行番号を保持するNR
特殊変数です。awk
したがって、これは、「現在行番号が1より大きい場合」、つまり「最初の行を除くすべての行について」を意味します。print prev " " $1;
NR
:と同じですが、$1
行の最初のフィールドを保持する特殊変数でもあります。フィールドは空白として定義されているため(デフォルトでを使用して変更できます)、will be、will beなどの行-F
が提供されます。したがって、これは変数値(次の点を参照)、空白()、現在の行の最初のフィールドを印刷します。foo bar
$1
foo
$2
bar
prev
" "
prev = $1;
:この行の最初のフィールドを変数に保存しますprev
。したがって、次の行を処理するときは、prev
前の行の最初のフィールドがあります。
その機能を確認するには、テスト入力で試すことができます。たとえば、seq 5
whichを使用して1から5までの数字を印刷します。
$ seq 5
1
2
3
4
5
$ seq 5 | awk '{ if (NR > 1) print prev " " $1; prev = $1; }'
1 2
2 3
3 4
4 5
上記のように、awkスクリプトは前の行の最初のフィールドを印刷し、現在の行の最初のフィールドを印刷します。
答え2
入力ファイルがスペースで区切られたファイルであるとします。ここで提供されるコードはファイル全体を読み込み、1行の最初の列値のみを出力します。
たとえば、次のようinput.txt
になります。 -
AAA 4443
BBB 5595
CCC 4949
DDD 4434
スクリプトawk
は以下を出力します。
AAA BBB
BBB CCC
CCC DDD
DDD
最初の行を読み取ると、最初の行の最初の列であるAAAが変数に保存されますprev
。 2行目を読むと、prevの値、つまりが印刷され、AAA
2行目の最初の列が印刷されますAAA BBB
。これでBBB
変数に保存されますprev
。 3行目を読むと印刷されますBBB CCC
。 4行目を読むと印刷されますCCC DDD
。