0

次のように、file1 と file2 の 2 つのファイルがあります。

ファイル1 ファイル2
オレンジジュースorangejuice_9.88_9.88
パイナップルジュースリンゴスライス_6.3_2.2
りんごスライス pineapplejuice_1.2_3.9
マンゴージュース Mangojuice_5.55_5.55

出力は次のようになります。

オレンジジュース_988
パイナップルジュース_120_390
appleslices_630_220
マンゴージュース_555

file1 から 1 行ずつ読み取りながら、file2 の file1 の行で見つかったパターンを検索し、見つかったら file2 の 2 番目と 3 番目のフィールドを比較し、同じ場合は 1 回出力し、そうでない場合は 2 つの数値を出力します。いずれにせよ、数値に 100 を掛ける必要があります)

私はこれについて考えました:

while read -r -u 3 line1
do
nawk ' "$line1" print $0}' file2.txt
if "$2" == "$3"
then echo "scale=2;$2*100" |bc
else echo "$2_$3"
fi
done 3<file1.txt

したがって、ロジックが正しいかどうかを知り、988.0 ではなく 988 になる乗算を修正する必要があります。

4

2 に答える 2

1

あなたのロジックは、純粋に Awk で表現する方がはるかに簡単です。の役割がfile1データを一部のレコードのみに制限することであると仮定するとfile2(あなたの例はこれを示していないようです)、このようなことを試してください。

awk -F _ '# Make OFS equal to FS
    BEGIN { OFS=FS }
    # Read file1 into a[]
    NR==FNR { a[$0]++; next }
    # If we fall through to here, we are in file2
    # On any lines where $1 is in a[]
    a[$1] {
        if ($2==$3) print $1, $2*100;
        else print $1, $2*100, $3*100;
    }' file1 file2
于 2013-08-11T16:24:53.670 に答える
1

片道GNU awk:

$ awk 'NR==FNR{a[$0];next}($1 in a){print $1,$2==$3?$2*100:$2*100OFS$3*100}' FS=_ OFS=_ file1 file2
orangejuice_988
appleslices_630_220
pineapplejuice_120_390
Mangojuice_555
于 2013-08-11T16:26:00.513 に答える