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