Сравнивая два файла и объединяя данные

У меня есть файлы ниже,

total.txt

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

changed.txt

order3,8,item3
order8,12,item8

total.txt - это данные общего заказа, а change.txt - недавно измененные данные. Я хочу объединить недавнее изменение с общим, я хочу вывод как

output.txt

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

Примечание. 2-й столбец (3-й и 5-й) строки файла total.txt обновляется с помощью файла change.txt.

я использовал ниже nawk сравнить первый coulmn, но не смог распечатать его в выходной файл. Пожалуйста, помогите выполнить следующую команду

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

4 ответа

Другая 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

Это может работать для вас (GNU sed):

sed -r 's/^([^,]*,).*/s|^\1.*|&|/' changed.txt | sed -f - total.txt > output.txt

Этот однострочный у вас работает?

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

Читать сначала 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
Другие вопросы по тегам