LoginSignup
1
0

More than 5 years have passed since last update.

bashで『先頭から特定行を除いたそれ以降のテキスト内容』を表示しようとしたけどawkがよくわかんなかった。

Last updated at Posted at 2018-04-20

やりたかったこと

ようするに、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
1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0