awk 複数行の処理

ファイルには様々な形式があります。1行単位で記述されたCSV(カンマ区切り)ファイルやTSV(タブ区切り)ファイルは、awkやsed、その他のbashコマンドなどを使っても比較的処理がしやすい。しかし、複数行でレコードが構成される場合(1行目が名前、2行目が住所、3行目が電話番号・・・など)は少し厄介です。awkで複数行のレコードを処理する方法を考えてみます。

とにかく早く問題解決したい人はこちら>>直接、データ解析相談

awk レコードが複数行で構成される場合

レコード区切り(改行文字)・フィールド区切り(空白文字)の設定を任意の文字に変更することで、複数行にわたるデータを1レコード・1行毎のデータをレコード内のフィールドとして扱うことができます。

awk レコードは行単位がデフォルト

awkのデフォルトの処理単位は1行単位です。改行を目印に1行分1レコード読み取り、空白文字の区切り文字でフィールドに分割します。これらは、システム変数RSFSで設定されています。

BEGEIN {FS="[ \t\n]+"; RS="\n"}

awk レコードの区切り文字を変更する

レコードが複数行で構成される場合、システム変数RSを空白行(””)や任意の文字へ、システム変数FSを改行(”\n”)へ変更します。これで、任意の区切り文字までの行ブロックが1つのレコードとなり、1行ずつの情報がレコード内のフィールドとして管理することができます。

BEGEIN {FS="\n"; RS=""}

awk 複数行の処理

awk 複数行を処理する(空白行が区切り)

システム変数RSFSの設定を変更して、複数行でレコードが構成されるファイルを処理してみましょう。まずは、空白行が区切りの場合です。

awk lines1.dat

空白行が区切りとなるデータを準備します。

$ cat awk_lines1.dat
name_1
address_1
tel_1
work_1

name_2
address_2
tel_2
work_2

awk lines1.awk

空白行を区切りとして、レコード処理します。各行がフィールドです。先頭と最後のフィールドを表示します。

BEGIN {FS="\n"; RS=""}
{print $1, $NF}

実行と結果

$ awk -f awk_lines1.awk awk_lines1.dat 
name_1 work_1
name_2 work_2

awk 複数行を処理する(その他の文字が区切り)

システム変数RSFSの設定を変更して、複数行でレコードが構成されるファイルを処理してみましょう。レコードの区切り文字が#(任意の文字)の場合です。

awk lines2.dat

#が区切りとなるデータを準備します。

$ cat awk_lines2.dat
name_11
address_12
tel_13
work_14
#
name_21
address_22
tel_23
work_24
#

awk lines2.awk

#を区切りとして、レコード処理します。各行がフィールドです。先頭と最後のフィールドを表示します。RSを”#”としてもうまくいきませんでした。RSを”#\n*”と設定すると想定したとおりレコードを認識します。最後のフィールドはシステム変数NFを使って$NFで表示できるかと思いましたが、(NF-1)番目と指定するとうまく表示できました。

BEGIN {FS="\n"; RS="#\n*"}
{print $1, $(NF-1)}

実行と結果

$ awk -f awk_lines2.awk awk_lines2.dat 
name_11 work_14
name_21 work_24

実験データの解析や論文用グラフ作成のヒントになりそうな、プログラミング・統計処理の参考になる書籍をまとめて紹介しています。是非、参考にしてみて下さいね。

とにかく早く問題解決したい人はこちら>>直接、論文相談

関連記事

awk 行の表示 先頭行 最終行 指定行
awk 置換や部分文字列などの文字列処理 gsub sub match index split 等
awk split | サンプルでわかる列の分割とセパレータ指定方法
awk while・do 繰り返し処理
awk for | サンプルでわかる、基本的な繰返し・変則的な繰返し
awk if サンプルでわかる条件文の書き方 一致・大小比較・正規表現を簡潔に書く方法
awk 配列 使い方
awk よく使うシステム変数と使い方
awk パターンとアクション
awk 区切り文字とフィールド
awk コマンドラインでの実行とスクリプトファイルでの実行
awk 使い方 フィールド取り出し スクリプトの書き方
awk 使い方 フィールド取り出し スクリプトの書き方
正規表現 メタキャラクタ 検索・置換 後編



カテゴリー

今週よく読まれている記事

  1. 学会・会議で英語が絶望的にできなくて困るケース | オンライン開催で「英語力のなさ」を痛感した場合の対処法

    学会・会議で英語ができなくてに困るケース学会やイベント・会議などが、オンラインで開催される…
  2. r tidyverse 使い方 | 列 filter 絞り込み select関数 – dplyrパッケージ

    tidyverseで1つのデータフレームの列の絞り込みは、dplyrパッケージのselect関数を…
  3. プログラミングで疲れた脳をリフレッシュ 〜 鬼滅の刃「感動」と「やる気アップ」でストレス発散!

    ストレス発散は鬼滅で。「50%OFF」で読む!脳のパフォーマンスを上げるには、適度な休憩と…
  4. AWS ディスク容量不足 新しいボリュームを追加する

    バイオインフォマティクスでは大きなファイルを扱うことがあるので、ディスク不足に陥ることがあります。…
  5. 「知っている」と「知らない」とでは、もしものとき、大違いになる – コロナうつ対策

    コロナうつなどという言葉を聞くようになりましたが、派遣切り、解雇、リストラは、これから本格化します…

人気記事

  1. Excel, 統計

    z-score 計算方法 エクセル(Excel) 編
    統計処理で、大きく変化しているなどの判断基準にも使われる値…
  2. IGV, 解析ツール

    IGV 使い方 インストール〜便利な使い方まで | リファレンス・マッピングデータ・アノテーションを読み込んで表示しよう
    IGV(Integrative Genomics View…
  3. R言語

    R subset関数 データフレームやmatrixからの条件指定による行・列の抽出
    R の subset関数は、データフレームやマトリックスか…

おすすめ記事

  1. awk, シェルスクリプト

    bash 部分文字列・置換・長さ・連結・分割の文字列処理
    bashのよく使う文字列処理、部分文字列・置換・連結・長さ…
  2. R言語, グラフ

    R 使い方 軸・ラベルの調整(向き・サイズ・色など) グラフの描き方
    Rによるplot(グラフ)の描画は、手軽で大変便利です。た…
  3. シェルスクリプト

    シェルスクリプト | ファイル存在チェック・空ファイルチェック
    bashでスクリプトを作成するときに、よく使うのがファイル…