2

たとえば、次のコマンドを実行するとします。

gawk -f AppendMapping.awk Reference.tsv TrueInput.tsv

ファイルの名前が変更されると仮定します。最初のファイルを繰り返しながら、マッピングを作成したいと考えています。

map[$16]=$18

2 番目のファイルを繰り返しながら、マッピングを使用したいと考えています。

print $1, map[$2]

この動作を実現する最善の方法 (つまり、入力ファイルごとに異なる動作) は何ですか?

4

3 に答える 3

4

おそらくご存じのとおりNR、現在の行番号を格納します。ご存じかもしれませんが、ご存知かもしれませんが、これは累積的であり、ファイル間でリセットされることはありません。FNR、一方、ファイルに固有であるため、これら2つを使用して、最初のファイルにいるかどうかを確認できます(2番目以降は、独自のカウンターを保持する必要があります)。

# In case you want to keep track of the file number
FNR == 1 { fileno++ }*emphasized text*

NR == FNR {
    # First file
}
NR != FNR {
    # Second or later file
}

getlineブロック内で使用して、BEGIN手動でループすることもできます。

BEGIN {
    file = ARGV[1]
    while(getline < file) {
        # Process line
    }
    delete ARGV[1]
}
于 2012-05-21T19:21:28.150 に答える
1

gawk バージョン 4 以降では、通常のandブロックだけでなく、特別なBEGINFILE (and ) ブロックも提供されます。これらを使用して、コードの動作を変更するフラグを設定します。ENDFILEBEGINEND

パターンには変数との比較を含めることができるため、フラグの値でパターンを直接選択できることを思い出してください。

マニュアルページには次のように書かれています:

入力ファイルごとに、BEGINFILE ルールが存在する場合、gawk はファイルの内容を処理する前に関連するコードを実行します。同様に、gawk はファイルの処理後に ENDFILE に関連付けられたコードを実行します。

于 2012-05-21T19:18:59.237 に答える
0

これはあなたのために働くかもしれません:

seq 5 >/tmp/a
seq 100 105 >/tmp/b
awk 'FILENAME==ARGV[1]{print FILENAME,$0};FILENAME==ARGV[2]{print $0,FILENAME}' /tmp/{a,b}
/tmp/a 1
/tmp/a 2
/tmp/a 3
/tmp/a 4
/tmp/a 5
100 /tmp/b
101 /tmp/b
102 /tmp/b
103 /tmp/b
104 /tmp/b
105 /tmp/b

したがって、コマンドラインのn番目のファイルがFILENAMEどこARGV[n]にあるかと組み合わせることにより、条件付きで個々のファイルを変更できます。nawk

NBARGV[0]がawkコマンドになります。

于 2012-05-21T20:34:16.260 に答える