Пробел изменен, поскольку вы печатаете i) первое и второе поля, объединенные и ii) третье поле. По умолчанию awk
использует пробел в качестве разделителя выходного поля ( OFS
), так что ваш интервал становится беспорядочным. Простое решение - сохранить саму строку ( $ 0
) в массиве вместо полей:
a[$1$2]=$0;
Однако ваш сценарий все равно не делает то, что вы хотите. Он будет печатать только те строки из файла1, которые присутствовали в файле2, поэтому все, что есть только в файле1, будет пропущено. В соответствии с желаемым выводом вы хотите распечатать все строки из обоих файлов и, если какая-либо строка файла file2 имеет те же первые два поля, что и поле file1, распечатайте только соответствующую строку из file1. Вы можете сделать это в awk
с помощью:
awk 'FNR==NR{a[$1$2]=$0; print} !($1$2 in a) {print}' file1 file2
Это сохранит каждую строку file1
в массиве, а также распечатает ее. Затем, когда обрабатывается file2
, он напечатает любую строку, первые два поля которой не находятся в a
.
Обратите внимание, что вы также можете сделать это с помощью sort
:
$ sort -uk1,2 file1 file2
11111111 abc12345 Y
22222222 xyz23456 Y
33333333 kbc34567
Вам просто нужно убедиться, что количество пробелов в двух файлах одинаково (в вашем примере это не так) , или сделайте это с помощью:
$ sed 's/ */\t/g' file1 file2 | sort -uk1,2
11111111 abc12345 Y
22222222 xyz23456 Y
33333333 kbc34567
Расширенный тест[[
предназначен для использования с определенными операторами , а не с командами.
Следующая команда awk
должна работать:
awk -vcheck="$Str" '(check ~ $1 && length($1) > 3) {found="yes"} END {if (found=="yes") {print "yes"} else {print "no"}}' words.txt
Это проверит, является ли каждое слово в файле подстрокой входной строки и что длина слова больше 3. Если это так, для переменной found
будет установлено значение yes. Когда awk
завершит работу с файлом, он проверит, равно ли found
да, и если да, то напечатает yes
, иначе напечатает no
Если вам нужно это в оболочке, если конструкция делает что-то кроме печати да/нет, вы можете заменить операторы печати операторами выхода, например так:
if awk -vcheck="$Str" '(check ~ $1 && length($1) > 3) {found="yes"} END {if (found=="yes") {exit 0} else {exit 1}}' words.txt
then
echo yes
else
echo no
fi
Один из способов сделать это:
извлечь еще 4 -или -буквенных слова изwords.txt
передать результат в виде «файла» в grep -Ff
, чтобы выполнить фиксированное -сопоставление строки с содержимым переменной:
Пр. используя замену процесса bash и здесь строка
grep -Fqf <(grep '....' words.txt) <<< "$str" && echo "found" || echo "not found"