AWKシリーズ第4回目、今回はFPATを使ったテクニックです
以下の様な行をカンマをフィールド区切り文字で出力してみます。
1 2 |
$ echo 'tanaka,"Tokyo, Shinjuku", male' | awk -F ',' '{print $2}' "Tokyo |
そう、なんか違う・・
"Tokyo, Shinjuku"まで出してほしい。。
そんなときはFPATを使えば解決です
FPAT
フィールドパターンの略でしょ(適当
FPATを使えば一行のうち、どれをフィールド(列)として認識するかを定義できるぞ
こんなふうに
1 2 |
$ echo 'tanaka,"Tokyo, Shinjuku", male' | awk -v FPAT='([^,]+)|(\"[^\"]+\")' '{print $2}' "Tokyo, Shinjuku" |
正規表現でフィールドと認識させる文字列パターンを定義するだけ
上の例では、カンマ以外の文字列と「"」ダブルクオーテーションで囲まれた部分がフィールドになるようにしているので、ちゃんと"Tokyo, Shinjuku"て出ている
それでは問題
問題
sample.csv
1 2 3 4 |
住所,名前,性別,一言コメント,趣味 111-2222,Tanaka Tarou,Male,"こんにちは,よろしくお願いします","旅行,温泉" 111-2222,Yamada Hanako,Female,"はじめまして,よろしくお願いします","Twitter,2ch" 111-2222,Yamamoto Takashi,Male,"みんなと仲良くしたいです,よろしくお願いします","ゲーム,スポーツ" |
- 4列目と5列目を出力してください
- 5列目に"Twitter"を含む行のみ出力してください
- 全体をハイフン区切りで"sample.hsv"という形式で書き込んでください
行けましたかね?それでは!
4列目と5列目を出力してください
1 2 3 4 5 |
$ cat sample.csv | awk -v FPAT='([^,]+|\"[^\"]+\")' '{print $4,$5}' 一言コメント 趣味 "こんにちは,よろしくお願いします" "旅行,温泉" "はじめまして,よろしくお願いします" "Twitter,2ch" "みんなと仲良くしたいです,よろしくお願いします" "ゲーム,スポーツ" |
上の例のほぼコピペでいけるね
5列目に"Twitter"を含む行のみ出力してください
1 2 |
$ cat sample.csv | awk -v FPAT='([^,]+|\"[^\"]+\")' 'match($5,/Twitter/) {print $0}' 111-2222,Yamada Hanako,Female,"はじめまして,よろしくお願いします","Twitter,2ch" |
前回のmatchと組み合わせたら可能
全体をハイフン区切りで"sample.hsv"という形式で書き込んでください
1 2 3 4 5 6 |
$ cat sample.csv | awk -v FPAT='([^,]+|\"[^\"]+\")' -v OFS='-' '{$1=$1;print $0}' > sample.hsv $ cat sample.hsv 住所-名前-性別-一言コメント-趣味 111-2222-Tanaka Tarou-Male-"こんにちは,よろしくお願いします"-"旅行,温泉" 111-2222-Yamada Hanako-Female-"はじめまして,よろしくお願いします"-"Twitter,2ch" 111-2222-Yamamoto Takashi-Male-"みんなと仲良くしたいです,よろしくお願いします"-"ゲーム,スポーツ" |
OFSで出力する区切り文字をハイフンにして、$1=$1でフィールドの再構築を行い、その結果をリダイレクトでsample.hsvとして書き込めばOK
まとめ
- FPATを使うことでフィールドを正規表現で定義されたものに指定できる
- FPATで区切られたフィールドは別の文字列操作関数で参照できる
「シェル芸」に効く!AWK処方箋
コマンドであり軽量言語(LL)の元祖でもあって、
シェルでのテキストデータ処理には便利で手放せない
「AWK」の魅力と書き方、シェルコマンドと組み合わせた
テクニック(シェル芸)を解説!
コマンドであり軽量言語(LL)の元祖でもあって、
シェルでのテキストデータ処理には便利で手放せない
「AWK」の魅力と書き方、シェルコマンドと組み合わせた
テクニック(シェル芸)を解説!