Я должен сравнить один - второй столбец на двух таблицах линию за линией. Таблицы: 1.csv
1a 2
14 4g
2.csv
1a 2
1 4
Сценарий:
#!/bin/bash
text1=$(cat "1.csv" | awk '{print $2}')
text2=$(cat "2.csv" | awk '{print $2}')
if [[ "$text1" == "$text2" ]]
then
echo "true"
else
echo "false"
fi
Но я получаю только один результат - ложь.
Почему я получаю только один результат - ложь? должен быть верен (2=2) ложь (4 г! =4)
Try:
paste 1.csv 2.csv | awk '$2 == $4 {print "true"; next} {print "false"}'
Пример:
$ paste 1.csv .csv | awk '$2 == $4 {print "true"; next} {print "false"}'
true
false
Команда paste
объединяет строки из предоставленных ей файлов, поэтому я получаю строку `первого файла и строку 1 из второго файла в первой строке вывода и т. Д .:
$ paste f1 f2
1a 2 1a 2
14 4g 1 4
Это позволяет напрямую сравнивать поля в awk
, которые затем могут вывести желаемую строку.
Команда next
в awk
переходит на следующую строку без обработки дальнейших команд, поэтому мне не нужно записывать условие $2 != $4
для второго блока.
С awk
:
awk 'NR==FNR {a[NR]=$2; next}; a[FNR]==$2 {print "true"; next} \
{print "false"}' f1.csv f2.csv
{a[NR]=$2; next}
будет выполняться только для первого файла, f1.csv
, массив a
будет создан с ключом как номер строки и значение как соответствующее значение второго поля для записи
a[FNR]==$2 {print "true"; next} {print "false"}
проверки, если значение от массива a
для соответствующего номера строки от f2.txt
будет равно, он - второе поле, раз так true
еще печатается false
, печатается
Пример:
% cat f1.csv
1a 2
14 4g
% cat f2.csv
1a 2
1 4
% awk 'NR==FNR {a[NR]=$2; next}; a[FNR]==$2 {print "true"; next} {print "false"}' f1.csv f2.csv
true
false