0

私は以下のファイルを持っています、

合計.txt

order1,5,item1
order2,6,item2
order3,7,item3
order4,6,item4
order8,9,item8

変更された.txt

order3,8,item3
order8,12,item8

total.txt は合計注文データで、changed.txt は最近変更されたデータです。最近の変更を合計でマージしたい、出力を次のようにしたい、

出力.txt

order1,5,item1
order2,6,item2
order3,8,item3
order4,6,item4
order8,12,item8

注: total.txt の 2 列目 (3 行目と 5 行目) は changed.txt ファイルで更新されます

以下nawkを使用して最初の列を比較しましたが、出力ファイルに出力できませんでした。以下のコマンドを完了するのを手伝ってください

nawk -F"," 'NR==FNR {a[$1]=$2;next} ($1 in a) "print??"' total.txt changed.txt

4

4 に答える 4

3

awk

awk -F, 'FNR==NR {a[$1]=$0;next} {print (a[$1]?a[$1]:$0)}' changed.txt total.txt
order1,5,item1
order2,6,item2
order3,8,item3
order4,6,item4
order8,12,item8

それはどのように機能しますか?

awk -F, '                       # set field separator to ","
    FNR==NR {                   # run this only on first file "changed.txt"
        a[$1]=$0                # store "changed.txt" in array "a" using first field as index
        next                    # skip to next record
    }
        {                       # run this when second file is read "total.txt"
        print (a[$1]?a[$1]:$0)  # if filed exist in "changed" use that, else use "total"
    }' changed.txt total.txt    # read these files
于 2013-11-09T21:24:39.333 に答える
2

これはうまくいくかもしれません(GNU sed):

sed -r 's/^([^,]*,).*/s|^\1.*|&|/' changed.txt | sed -f - total.txt > output.txt
于 2013-11-09T22:02:40.530 に答える
1

このワンライナーはあなたのために働きますか?

awk -F, 'NR==FNR{a[$1]=$0;next}a[$1]{$0=a[$1]}7' change total

テスト:

kent$  head c t
==> c <==
order3,8,item3
order8,12,item8

==> t <==
order1,5,item1
order2,6,item2
order3,7,item3
order4,6,item4
order8,9,item8

kent$  awk -F, 'NR==FNR{a[$1]=$0;next}a[$1]{$0=a[$1]}7' c t
order1,5,item1
order2,6,item2
order3,8,item3
order4,6,item4
order8,12,item8
于 2013-11-09T21:50:38.570 に答える
0

最初のchanged.txtファイルを読み取り、データをハッシュに保存します。次に、最初のフィールドが存在するかどうかを比較total.txtし、値を置き換えます。

awk '
    BEGIN { FS = OFS = "," } 
    NR == FNR { a[$1] = $2; next } 
    { if ( $1 in a ) { $2 = a[$1] } print }
' changed.txt total.txt

次の結果が得られます。

order1,5,item1
order2,6,item2
order3,8,item3
order4,6,item4
order8,12,item8
于 2013-11-09T21:23:39.057 に答える