awkでスクリプトを作成する

awkでスクリプトを作成する

テキストファイルの形式を再指定するコマンドを実行します。

awk -F, '{if ($6<0) print $1$2,"   "$3$4,$5$6;
               else print $1$2,"   "$3$4$5,$6;}' filename.txt > seqXXX.txt

毎回コマンドを入力する必要がないように、これをスクリプトに置き換えることはできますか?これを行う方法についての記事を読んだが、もっと混乱している。

答え1

これを行う方法は、スクリプトに変換したいコマンドの部分によって多少異なります。次の3つのバリエーションを提供します。

  1. プログラムawk自体がスクリプトとして機能します。
  2. コマンドは全体としてスクリプトとして機能します。
  3. このコマンドはシェル機能として機能します。

このawkプログラムは次のようにスクリプトに置き換えることができます

#!/usr/bin/awk -f

BEGIN { FS = "," }

{
    if ($6 < 0)
        print $1$2,"   "$3$4,$5$6
    else
        print $1$2,"   "$3$4$5,$6
}

まず、フィールド区切り記号をコンマに設定し、各入力行でコードブロックを実行します。

ここで使用されている-lineを使用すると、スクリプトファイルを実行したときにコマンドラインに書き込んだかのように実行されます#!awk -f script.awk最初の行で使用されるパスは、awkシステムの正しいインタプリタを指すように調整する必要があります(出力を参照command -v awk)。

chmod +x script.awk以下を使用してファイルを実行可能にした後

$ ./script.awk filename.txt >seqXXX.txt

このコマンドは、次のようにシェルスクリプトに入れることができます。

#!/bin/sh

awk -F, '{if ($6<0) print $1$2,"   "$3$4,$5$6;
               else print $1$2,"   "$3$4$5,$6;}' "$@"

ここでは、基本的にコマンドをシェルスクリプトに移植しました。コマンド"$@"の末尾にあるビットは、awkスクリプトに提供するコマンドライン引数(単一の入力ファイルの名前でもあります)に置き換えられます。

この実行可能ファイルを作成したら、次のように使用できます。

$ ./script.sh filename.txt >seqXXX.txt

ファイル名が次の場合変化のない絶対に変更せずにスクリプトに入れてください。

#!/bin/sh

awk -F, '{if ($6<0) print $1$2,"   "$3$4,$5$6;
               else print $1$2,"   "$3$4$5,$6;}' filename.txt >seqXXX.txt

次に、追加のパラメータやリダイレクトなしでコマンドラインからスクリプトを呼び出します。


コマンドをシェル関数に変換できます。これはエイリアスとほぼ同じですが、一般的にはより柔軟です。

myreformat () {
    awk -F, '{if ($6<0) print $1$2,"   "$3$4,$5$6;
                   else print $1$2,"   "$3$4$5,$6;}' "$@"
}

これは通常シェルエイリアスなどを置く場所に配置されます(シェルを~/.bashrc使用している場合はおそらくそこにあります)。bashこの機能は以下で利用できます。開始したシェルセッション。

上記のシェルスクリプトバリアントとほぼ同じ方法で呼び出されます。

$ myreformat filename.txt >seqXXX.txt

関連情報