Как использовать вывод команды sed в качестве строки и использовать эту строку в команде grep? - PullRequest
0 голосов
/ 30 мая 2019

У меня есть файл с одной строкой на строку «File1» и файл с двумя строками на строку «File2». Я не хочу проходить через File1 и проверять каждую строку / строку, сколько строк в File2 появляется.

Я хотел бы использовать что-то вроде этого:

grep '{sed -n 1p File1}' File2

Но это не работает. Почему и что мне делать?

// Спасибо!

1 Ответ

2 голосов
/ 30 мая 2019

Мне кажется, что вы задаете два совершенно разных вопроса: один в названии и один в теле.Я постараюсь обобщить их и отвечу на оба вопроса.

Первый вопрос:

Как использовать вывод команды 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
...