忘れないようにメモっとく

機械学習とかプログラミングとか。

awkユーザーのためのPerlワンライナー

awk(と他のコマンド)ユーザーがPerlワンライナーを覚えるとうれしいこと↓↓

  • -aオプションでawkと似たような書き方ができる(awkとの比較を参考)
    • カラム1とカラム2を表示
awk '{print $1, $2}'
perl -waln -e 'print $F[0], $F[1]'

 

  • awkよりperlの方が速い場合がある
    • 例えば-aオプションを使わないとき、$F[0]などをレコードごとに生成しないのでperlの方が速く実行できる場合がある(awkはレコードごとに$1などを生成する)
awk 'BEGIN{sum=0};{sum+=1};END{print sum}' file.txt
perl -wln -e 'BEGIN{my $sum=0}{$sum+=1}END{print $sum}' file.txt

 

  • 正規表現perlだけ覚えればいい(awk, sed, grepのコマンドごとに覚えなくていい)

  • 複雑なことをやろうとするときに拡張が楽(cpanモジュール使える、複数ファイルでも問題なし)

perlオプション

オプション 意味
-e スクリプトコマンドラインで実行
-w 警告
-n 暗黙のループ
-p 自動print
-l 行末処理
-a 入力レコードを配列@Fへ分割
-F INPUTセパレータを指定

特殊変数(awkとの比較)

perl awk 意味
$_ $0 最後に読み込んだレコード
$. NR レコード番号
$#F NF フィールド数
$/ RS INPUTレコードセパレータ
$\ ORS OUTPUTレコードセパレータ
$ARGV[0] FILENAME ファイル名
$, OFS OUTPUTフィールドセパレータ

そのほか

# $_にhogeが含まれる
perl -waln -e 'if(/hoge/) {print $_}' file.txt
# $_にhogeが含まれない
perl -waln -e 'if(!/hoge/) {print $_}' file.txt


# $F[0]にhogeが含まれる
perl -waln -e 'if($F[0] =~ /hoge/) {print $_}' file.txt
# $F[0]にhogeが含まれない
perl -waln -e 'if($F[0] !~ /hoge/) {print $_}' file.txt

# hogeをfooに置換
perl -waln -e '$_ =~ s/hoge/foo/; print $_' file.txt