如何在路径中打印带有指定单词的行?

时间:2019-04-16 19:05:44

标签: awk

假设我有文件 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

我只想在 / some / path / 123 / path 下的第三位中打印包含“ 123”的整行, 我不想打印“ a c b / some / path / 312 / path ”行或 “ a b c / 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

因为它也捕获了例如“ a b c / some / path / 098 / path / 123 / ”。

示例

对于数字“ 123”,我只想从 123_number.txt 中的 abc.txt 中保存一行:

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

对于数字“ 312”,我只想从 312_number.txt 中的 abc.txt 中保存一行:

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

1 个答案:

答案 0 :(得分:1)

这可以在单个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 -