Сравнивая два файла и объединяя данные
У меня есть файлы ниже,
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