awk
2012/11/07 1行1レコード形式のデータ,特に大きなデータを取り扱うのに便利なのだということを某MLで知る.
今扱っている固定長データ(大きいのでも600MBくらいだけど)から分析に使うフィールドを切り出すのに便利そうだ.
※改行コードはLFを前提としていることに注意(2012/11/27追記)
網羅的なガイドは以下 http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_toc.html
こちらの方が取っつきやすいかも http://antibayesian.hateblo.jp/entry/2014/09/15/162605
フィールドの指定方法
awk.txtの全レコードに対して,2番目のフィールドを(標準)出力するには
awk '{ print $2 }' awk.txt
awk.txtの全レコードに対して,10番目と3番目のフィールドを(標準)出力するには
awk '{ print $10 $3 }' awk.txt
これだと連結されるので,間にブランクを入れる
awk '{ print $10 " " $3 }' awk.txt
詳しい解説は以下
http://www.ibm.com/developerworks/jp/linux/library/l-awk1/ http://shellscript.sunone.me/awk.html
2012/11/22 追記
パターンによるレコード範囲指定
レコード番号NRを使った範囲指定
組み込み変数のNRはレコード番号を指定する.ただし,NRとNFは変数とはいっても通常,値は代入はせず読み取り専用で用いる
awk.txtのレコード番号3(3行目)の,2番目のフィールドを(標準)出力するには
awk 'NR == 3 { print $2 }' awk.txt
awk.txtのレコード番号が5未満(1~4)の,1番目のフィールドを(標準)出力するには
awk 'NR < 5 { print $1 }' awk.txt
awk.txtのレコード番号が5未満(1~4)またはレコード番号が7の,全てのフィールドをout.txtに出力するには
awk 'NR < 5 || NR == 7 { print }' awk.txt > out.txt
※これは一行目がラベルになっているデータを分割する際に有用
フィールド区切り文字の指定
-Fオプションにより,フィールドの区切り文字を指定することが出来る.
awk.txtの区切り文字をスペースに指定して,全レコードに対して,2番目のフィールドを(標準)出力するには
awk -F" " '{ print $2 }' awk.txt
awk.csvの区切り文字をカンマに指定して,全レコードに対して,2番目のフィールドを(標準)出力するには
awk -F"," '{ print $2 }' awk.csv
ファイルへの出力
awk.txtのレコード番号が5未満(1~4)の,1番目と2番目のフィールドをカンマで区切ってoutput.csvに出力するには
awk 'NR < 5 { print $1 "," $2 }' awk.txt > output.csv
出力されたoutput.csvの中身
1,B1
2,B2
3,B3
4,B4
固定長レコードの読込
参考:http://www.geocities.jp/cygnus_odile/awkpage/14_awk_fixed_length.html
組み込み変数のFIELDWIDTHSを使って固定長レコードの各フィールド幅を指定可能(らしいが,上手くいかない)
このページで使っているデータ
awk.txt ```text 1 B1 C1 2 B2 C2 3 B3 C3 4 B4 C4 5 B5 C5 6 B6 C6 7 B7 C7 8 B8 C8 9 B9 C9 10 B10 C10 11 B11 C11 12 B12 C12 13 B13 C13 14 B14 C14 15 B15 C15 16 B16 C16 17 B17 C17 18 B18 C18 19 B19 C19 20 B20 C20 21 B21 C21 22 B22 C22 23 B23 C23 24 B24 C24 25 B25 C25 26 B26 C26 27 B27 C27 28 B28 C28 29 B29 C29 30 B30 C30 31 B31 C31 32 B32 C32 33 B33 C33 ```
awk.csv
```csv 1,B1,C1 2,B2,C2 3,B3,C3 4,B4,C4 5,B5,C5 6,B6,C6 7,B7,C7 8,B8,C8 9,B9,C9 10,B10,C10 11,B11,C11 12,B12,C12 13,B13,C13 14,B14,C14 15,B15,C15 16,B16,C16 17,B17,C17 18,B18,C18 19,B19,C19 20,B20,C20 21,B21,C21 22,B22,C22 23,B23,C23 24,B24,C24 25,B25,C25 26,B26,C26 27,B27,C27 28,B28,C28 29,B29,C29 30,B30,C30 31,B31,C31 32,B32,C32 33,B33,C33 ```
fixedlength.txt ```txt fixedlength 12345678900 abcdefghijk 12345678900 12345678900 abcdefghijk abcdefghijk 12345678900 fixedlength ```
