やりたかったこと
ようするに、headコマンドの逆がやりたかった。
$ cat test.txt
1 a
2
3 b
4
5 c
6
7 d
8
9 e
こういうテキストファイルがあったとして、例えば『先頭2行を切り抜く』なら
$ cat test.txt | head -n2
1 a
2
これでいいんだけど、これの逆、つまり 先頭2行を切り抜いたあとの残り を表示したかった。
最初はなんかうまいことheadにそういうオプションとかないのかなとか、tailでなんかうまいことできないかなと思ったけど、うまくいかなかったので、awkでやってみることに。
awkで行単位で切り抜くなら、NR==${行番号} でawkスクリプトの評価式に指定してやればいい。
$ cat test.txt | awk 'NR==3'
3 b
で、作りたい表示は
3 b
4
5 c
6
7 d
8
9 e
なんだけど、意図としては『3行目以降のすべて』なので、なんかループとかさせたらいいのかな?って思ったら、なんかわかんないけどこれでいけた。
$ cat test.txt | awk 'NR==3,NR==0'
3 b
4
5 c
6
7 d
8
9 e
評価式の二つ目に、以降を切り抜きたい行番号である3より若い数字を指定したら、なぜか最後まで出力された。そういう仕様なのかな。
ちなみに、3未満であれば上記同様、負の数字でも動作した。
$ cat test.txt | awk 'NR==3,NR==1'
3 b
4
5 c
6
7 d
8
9 e
$ cat test.txt | awk 'NR==3,NR==-1'
3 b
4
5 c
6
7 d
8
9 e
また、以下のような指定でも同様に動作した。
$ cat test.txt | awk 'NR==3,NR=0'
3 b
4
5 c
6
7 d
8
9 e
※=を一つ減らす
$ cat test.txt | awk 'NR==3,NR0'
3 b
4
5 c
6
7 d
8
9 e
※=を二つ減らす
$ cat test.txt | awk 'NR==3,N0'
3 b
4
5 c
6
7 d
8
9 e
え、これでも動くの
$ cat test.txt | awk 'NR==3,0'
3 b
4
5 c
6
7 d
8
9 e
もはやこの0の意味。。
ちなみにこの状態だと、
$ cat test.txt | awk 'NR==3,1'
3 b
これはこうなる。1以外の数字でも同様。
結論
とりあえず、やりたかったこととしては、
$ cat test.txt | awk 'awk=={行番号},0'
で達成できたんだけど、なぜこれで意図したものが得られるのかわからないので、詳しい人に解説してほしい。。
環境
$ uname -r
4.9.85-37.55.amzn1.x86_64
$ awk --version
GNU Awk 3.1.7