Как напечатать строки с указанным словом в пути? - PullRequest
1 голос
/ 16 апреля 2019

Допустим, у меня есть файл abc.txt , который содержит следующие строки:

a b c /some/path/123/path/120
a c b /some/path/312/path/098
a p t /some/path/123/path/321
a b c /some/path/098/path/123

и numbers.txt :

123
321
123
098

Я хочу напечатать всю строку, содержащую «123» только в третьем месте в « / some / path / 123 / path », я не хочу печататьстрока " acb / some / path / 312 / path " или " abc / some / path / 098 / path / 123 / ".Я хочу сохранить все файлы с «123» на третьем месте в новом файле.

Я пробовал несколько способов, и лучший способ, похоже, использовать awk.Вот мой пример кода, который не работает правильно:

for i in `cat numbers.txt | xargs`
do
cat abc.txt | awk -v i=$i '$4 ~ /i/ {print $0}' > ${i}_number.txt;
done

, потому что он перехватывает, например, " abc /some/path/098/path/123/".

Пример :

Для числа "123" я хочу сохранить только одну строку из abc.txt в 123_number.txt :

a b c /some/path/123/path/120

Для номера "312" я хочу сохранить только одну строку из abc.txt в 312_number.txt :

a c b /some/path/312/path/098

1 Ответ

1 голос
/ 16 апреля 2019

это можно сделать одним вызовом awk:

$ awk -F'/' 'NR==FNR{a[$0];next} ($4 in a){f=$4"_number.txt";print >>f;close(f)}' numbers.txt abc.txt
$ cat 098_number.txt 
a b c /some/path/098/path/123
$ cat 123_number.txt 
a b c /some/path/123/path/120
a p t /some/path/123/path/321

хранить числа в массиве и использовать его для сопоставления строк, добавлять соответствующие строки в соответствующие файлы.

если ваши файлыогромны, вы можете ускорить процесс, используя sort:

sort -t'/' -k4 abc.txt | awk -F'/' 'NR==FNR{a[$0];next} ($4 in a){if($4!=p){close(f);f=(p=$4)"_number.txt"};print >>f}' numbers.txt -
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...