Мне кажется, что вы задаете два совершенно разных вопроса: один в названии и один в теле.Я постараюсь обобщить их и отвечу на оба вопроса.
Первый вопрос:
Как использовать вывод команды sed в качестве строки и использовать эту строку в grepкоманда?
Первый ответ:
Unix-способ заключается в передаче вывода команды в качестве ввода в другую программу.Если вместо этого вы хотите использовать вывод первой программы в качестве, например, параметра для последующей команды (а не ее ввода), есть удобная программа, которая позволяет вам сделать это: xargs
.
Пример передачи вывода sed
в качестве ввода в grep
:
sed -n 1p File1 | grep 'needle'
Пример использования вывода sed
в качестве строки поиска для grep
:
sed -n 1p File1 | xargs -I{} grep {} File2
Второй вопрос:
У меня есть файл, содержащий только одну строку в строке, «Файл1», и файл, содержащий две строки в строке, «Файл2».Я не хочу проходить через File1 и проверять каждую строку / строку, сколько строк в File2 появляется.
Второй ответ:
awk 'NR==FNR{!a[$0]++;next} $1 in a{a[$1]++} END{for(i in a){print i" "a[i]-1}}' File1 File2
Testfiles:
==> File1 <==
one
two
three
==> File2 <==
one apple
two bananas
two strawberries
three kiwis
three pomegrenades
three lychees
Вывод тестового прогона:
three 3
two 2
one 1
Это только в том случае, если вы хотите, чтобы строка из File1 отображалась как первый столбец File2.Для более общего подхода, где вы хотите подсчитать каждую строку File2, содержащую строку из File1:
awk 'NR==FNR{!a[$0]++;next} {for(i in a){if(match($0,i)){a[i]++}}} END{for(i in a){print i" "a[i]-1}}' File1 File2
Тестовые файлы:
==> File1 <==
one
two
three
==> File2 <==
one one
two one
two two
three three
three two
three one
Вывод тестового запуска:
three 3
two 3
one 3