0

私は以下のコードを使用して1つのファイルからレコードを読み取り、その6フィールドを他のファイルと比較して、それに応じて出力をファイルに書き込みます。

for FILE_NAME in `GET_FILE_LIST $1 $2 $3`
do
y=`echo $FILE_NAME|awk '{print $6}'`"X"
echo "Start --- `date`" >> $LOGF
echo $y >> $LOGF
cat $x |nawk ' BEGIN { FS=",";
while ((getline < "SUBNO.txt") > 0)
     myarray[$1] = $2
if(myarray[$6]==0)   
    ' > {${FILE_NAME}_P}
else
    ' > {${FILE_NAME}_S}
fi

UPD_FILE_STATUS $FILE_NAME 35
done

問題は、次のエラーが発生していることです。

./TEST.sh: line 95: syntax error near unexpected token `else'
./TEST.sh: line 95: `else'

次のような場合があります。1つのテキストファイルに次のようなデータがあります。

GGO     099E7C5S    34  533196588       45696   22
PPC     93403DSA    35  784397429       44696   56

2番目のファイルのデータは次のようになります。

22,0
24,1
26,0

私がやりたいのは、最初のファイルから行を書き込み、最後のフィールド値を2番目のファイルと比較することです。値が0の場合は、新しいfile_1に入れ、1の場合は、file_2に入れます。これで問題が解決することを願っています。助けてください。

4

3 に答える 3

1

このスクリプトには多くの悪い習慣がありますが、ここでは取り上げません。あなたが抱えている問題は、引用ルールについて混乱しているように見えることです。コードを考えてみましょう:

cat $x |nawk ' BEGIN { FS=",";
while ((getline < "SUBNO.txt") > 0)
     myarray[$1] = $2
if(myarray[$6]==0)   
    ' > {${FILE_NAME}_P}
else

一重引用符はに渡されるスクリプトを区切るnawkため、上記のスニペットは基本的に次のようになります。

cat $x | nawk cmds > {${FILE_NAME}_P}
else

エディターの色付け(およびここSOでの質問の表示でも)は、これを明確にする必要があります。elseに一致するifがないことに気付くでしょう。そのため、シェルはそれを構文エラーとして扱います。

。という名前のファイルにリダイレクトしていることに注意してください{xxx_P}。ファイル名{に文字を入れるのは珍しいことです。}

于 2012-12-12T17:44:47.060 に答える
0

以下は、file1に「、0」サフィックスが付いた6番目のフィールドが存在するすべての行をfile2から抽出します。これは、関連する行をfile1から単純なawkスクリプトに変換することによって行われます。「、1」の接尾辞を付けて繰り返して他のセットを取得するか、1回のパスですべてを実行するのに十分なawkを学習します。それは難しいことではありません。

sed /,0$/!d;s///;s/.*/$6 == "&"/p' file1 |
awk -f - file2

sedスクリプトはややあいまいです。一致しない行を削除し、一致するサフィックスを何も置き換えず、残りを適切なawk条件でラップします。

好みや要件に応じて、代わりに2番目のスクリプトをsedスクリプト(ヒント:wコマンドを探す)にすることも、最初のスクリプトをawkスクリプトにすることもできます。

于 2012-12-12T19:15:19.670 に答える
0

これにより、質問を更新して希望どおりの結果が得られます(file2の情報に基づいてfile1を分割します)

awk 'NR==FNR{sfx[$1]=$2; next} {print > ("file_" sfx[$NF]+0)}' FS="," file2 FS=" " file1

行の最後のフィールドにfile2にエントリがない場合、file1の行をどうするかを言わなかったので、私のスクリプトは、file2に0で終わるエントリがある場合と同じように扱います。それがあなたが望むものでない場合、それは簡単な修正です。

于 2012-12-12T20:10:29.923 に答える