AWK

AWKコマンド練習問題:2 [フィールド再構築というテクニック]

一年ぶりぐらいにAWKの練習問題を考えてみたぜw

なんか、以前の記事でも見てくれている人が多少いたんで、俺も勉強し治そうと思ったわ、ありがとー

てことで、今回のテーマは「フィールドの再構築」についてだ

AWKを使う上で覚えていて損はない部分らしいぞ

フィールドの再構築

分かりやすく言うとだな、

aaa,bbb,ccc ていうカンマ区切りの行があったとするとそれをスペース区切りaaa bbb ccc やハイフン区切りaaa-bbb-ccc

のように、レコード(一行)の区切り文字を変換するテクニックみたいなもん

じゃあ具体的どうするのかって言うと、下の通りで

-F でレコードの区切り文字を指定して -v OFS= の後に変換したい区切り文字を指定したあと

$1 = $1 を記述する、

$0 = $0ではだめ、$1であることが重要らしい

今回はこのテクニックを使った問題を用意したぞ

 

問題

サンプルテキストはこれ

  1. csv形式で出力してください
  2. 2列目が60以上の行をcsv形式で出力してください
  3. 2列目が60以上の行をcsv形式でsample.csvとして出力してください

 

 

 

 

 

 

いいでしょうか、、では解答は、こちら!

解答

csv形式で出力してください

上の例で言うところのOFSを","にすればいいだけだから簡単だと思う

2列目が60以上の行をcsv形式で出力してください

$1=$1でフィールド再構築したあとにも、if文で絞った行のみを出力することは可能

2列目が60以上の行をcsv形式でsample.csvとして出力してください

コマンドの後に'> {ファイル名}'で出力した結果をファイルに書き込むリダイレクトのテクニックを使うことで出力した結果をそのままファイル化することが可能

ていうか、フィールド再構築とリダイレクトを組み合わせると区切り文字を変換したファイル作成が簡単にできるので知っとけばお得

とはいえ、まだまだ万能ではない

例えば、以下のテキストに対して

これの3列の途中のスペースを別の区切り文字に変換したくないっていうのはよくあると思う。

ちなみに、これを愚直にcsvにしようとすると

いやー、だめっすねーww

3列目のスペースが変換されてる・・

まあ、これをいい感じに区切り文字を変換するにはフィールド再構築のテクニックだけではだめっぽいので、これは後ほど・・

まとめ

  • フィールド再構築を利用すると一行の区切り文字を別の区切り文字に変換できる
  • リダイレクトとフィールド再構築を組み合わせれば、tsvをcsvやhsvに変換したファイルを作成できる

 

「シェル芸」に効く!AWK処方箋
コマンドであり軽量言語(LL)の元祖でもあって、
シェルでのテキストデータ処理には便利で手放せない
「AWK」の魅力と書き方、シェルコマンドと組み合わせた
テクニック(シェル芸)を解説!

-AWK

© 2024 Shiro's secret base