У меня есть небольшой скрипт для сравнения некоторых столбцов внутри кучи файлов CSV. Он работает нормально, но есть некоторые вещи, которые меня прослушивают.Используйте AWK для печати FILENAME CSV
Вот код:
FILES=./*
for f in $FILES
do
cat -v $f | sed "s/\^A/,/g" > op_tmp.csv
awk -F, -vOFS=, 'NR == 1{next} $9=="T"{t[$8]+=$7;n[$8]} $9=="A"{a[$8]+=$7;n[$8]} $9=="C"{c[$8]+=$7;n[$8]} $9=="R"{r[$8]+=$7;n[$8]} $9=="P"{p[$8]+=$7;n[$8]} END{ for (i in n){print i "|" "A" "|" a[i]; print i "|" "C" "|" c[i]; print i "|" "R" "|" r[i]; print i "|" "P" "|" p[i]; print i "|" "T" "|" t[i] "|" (t[i]==a[i]+c[i]+r[i]+p[i] ? "ERROR" : "MATCHED")} }' op_tmp.csv >> output.csv
rm op_tmp.csv
done
Просто объяснить: я получаю все файлы в каталоге, то я использовать CAT заменить делитель^А для труб |. Затем я использую awk onliner для сравнения столбцов, которые мне нужны, и распечатайте результат на output.csv.
Но теперь я хочу напечатать имя файла перед каждым циклом. Я попытался с помощью кота SED и AWK в той же строке и печать $ FILENAME, но он не работает:
cat -v $f | sed "s/\^A/,/g" | awk -F, -vOFS=, 'NR == 1{next} $9=="T"{t[$8]+=$7;n[$8]} $9=="A"{a[$8]+=$7;n[$8]} $9=="C"{c[$8]+=$7;n[$8]} $9=="R"{r[$8]+=$7;n[$8]} $9=="P"{p[$8]+=$7;n[$8]} END{ for (i in n){print i "|" "A" "|" a[i]; print i "|" "C" "|" c[i]; print i "|" "R" "|" r[i]; print i "|" "P" "|" p[i]; print i "|" "T" "|" t[i] "|" (t[i]==a[i]+c[i]+r[i]+p[i] ? "ERROR" : "MATCHED")} }' > output.csv
Может кто-нибудь помочь?
Даже без gawk вы могли бы, наряду с несколькими другими настройками, поместить этот блок END в функцию и вызвать его в условиях «FNR == 1» и «END», и вам не понадобится цикл оболочки. 'ENDFILE' появился в gawk 4.0 btw, см. Http://www.gnu.org/software/gawk/manual/gawk.html#Feature-History. –
Это переработанное произведение, в конце концов я буду обновлять что-то подобное, но прямо сейчас я только что скорректировал с помощью переменной $ fname и печати перед каждым циклом. Также удалены временный файл и кошка. Большое спасибо. –