Как проверить, содержит ли вход в сценарий Bash слово из 4 или более букв из файла

Пробел изменен, поскольку вы печатаете 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
1
17.02.2019, 01:04
2 ответа

Расширенный тест[[предназначен для использования с определенными операторами , а не с командами.


Следующая команда 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
2
27.01.2020, 23:30

Один из способов сделать это:

  1. извлечь еще 4 -или -буквенных слова изwords.txt

  2. передать результат в виде «файла» в grep -Ff, чтобы выполнить фиксированное -сопоставление строки с содержимым переменной:

Пр. используя замену процесса bash и здесь строка

grep -Fqf <(grep '....' words.txt) <<< "$str" && echo "found" || echo "not found"
0
27.01.2020, 23:30

Теги

Похожие вопросы