我想知道如何打印文件名基于在几个文件中找到方形braquets之外的一个模式(两个选项中)。
这就是说:
NF
。第一个单词位于$(NF?NF-2:"")
或$(NF?NF-1:"")
。第二个单词位于$NF
。基于:
-F,
word1=Villa de Leyva
word2=Colombia
/^C1 /
($(NF?NF-2:"")==/Villa de Leyva/ && $NF==/Colombia/ ) || ($(NF?NF-1:"")==/Villa de Leyva/ && $NF==/Colombia/ )
IFF在同一个NR
输入
File 1 with name: xx1
PT J
C1 [Ramirez, P.A.; Villa de Leyva, A.; Smith, W.] University Villa de Leyva, Villa de Leyva, Colombia
C1 [Antunez, P.; Howard, R.; Li, X.] University X, Villa de Leyva, Caldas, Ecuador
[Trujillo, A.; Santos, K.; Wassermann, J.] Instituto Y, Villa de Leyva, Sweden
PY 9999
File 2 with name: xx100
PT J
C1 [Ramirez, P.A.; Villa de Leyva, A.; Smith, W.] University Villa de Leyva, Villa de Leyva, Chile
C1 [Antunez, P.; Howard, R.; Li, X.] University X, Villa de Leyva, Caldas, Colombia
C1 [Trujillo, A.; Santos, K.; Wassermann, J.] Instituto Y, Villa de Leyva, Sweden
PY 9999
File 3 with name: xx333
PT J
C1 [Ramirez, P.A.; Villa de Leyva, A.; Smith, W.] University Villa de Leyva, Villa de Leyva, Chile
C1 [Antunez, P.; Howard, R.; Li, X.] University X, Villa de Leyva, Caldas, Mozambique
[Trujillo, A.; Santos, K.; Wassermann, J.] Instituto Y, Villa de Leyva, Sweden
PY 9999
预期输出
xx1
xx100
答案 0 :(得分:1)
要检查模式是否存在于单个文件中,您可以使用:
cat /tmp/b | perl -pe 's/\[.*?\]//g' | grep -P "Villa de Leyva,[^,]*,* Colombia"
这将返回符合条件的行。
如果您想通过for:
查看多个文件循环 for i in $( ls file1 file2 ...);
> do
> if cat $i | perl -pe 's/\[.*?\]//g' | grep -q -P "Villa de Leyva,[^,]*,* Colombia"
> then
> echo $i
> fi
> done
Oneliner:
for i in $( ls *); do if cat $i | perl -pe 's/\[.*?\]//g' | grep -q -P "Villa de Leyva,[^,]*,* Colombia"; then echo $i; fi; done
答案 1 :(得分:1)
$ awk -F, 'NF>2 && $NF~/Colombia/ && ($(NF-2)~/Villa de Leyva/ || $(NF-1)~/Villa de Leyva/) {print FILENAME}' *
xx1
xx100
以上工作结合四个条件。如果满足条件,则打印文件名。
首要条件是:
NF>2
这要求该行至少有三个字段。
第二个必要条件是:
$NF~/Colombia/
这要求最后一个字段包含Columbia
。
最后,必须满足以下两个条件之一:
$(NF-2)~/Villa de Leyva/
$(NF-1)~/Villa de Leyva/
这些要求Villa de Leyva
出现在倒数第二个或第三个到最后一个字段中。
此处,要搜索的名称在命令行中作为变量awk
和var1
传入var2
:
$ awk -F, -v var2="Villa de Leyva" -v var1="Colombia" 'NF>2 && $NF~var1 && ($(NF-2)~var2 || $(NF-1)~var2) {print FILENAME}' xx*
xx1
xx100
答案 2 :(得分:1)
grep应该足够了,-l选项只打印文件名,如果用@和$ like锚定它,那么你寻找的模式不应该跨越行:
grep -l '^.*Villa de Leyva.*Colombia.*$' xx*
Output:
xx1
xx100