如果在“方括号”外找到1个条件(2个选项中),则打印FILENAME

时间:2014-11-04 23:11:19

标签: regex bash awk sed grep

我想知道如何打印文件名基于在几个文件中找到方形braquets之外的一个模式(两个选项中)。

这就是说:

  1. 查找两种模式(模式是重复到多个文件中的单词),如果两者都在文件的同一行,则打印FILENAME。
  2. 这两个词在方括号外。
  3. 这两个字位于NF。第一个单词位于$(NF?NF-2:"")$(NF?NF-1:"")。第二个单词位于$NF
  4. 基于:

    -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
    

3 个答案:

答案 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出现在倒数第二个或第三个到最后一个字段中。

从shell传递搜索参数

此处,要搜索的名称在命令行中作为变量awkvar1传入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