【问题标题】:Grep specific part of string from another file从另一个文件中grep字符串的特定部分
【发布时间】:2015-06-16 15:21:27
【问题描述】:

我想从 2.txt 中的零后的前三位数字中提取 1.txt 中的前三位数字。

猫 1.txt

 23456
 12345
 6789

猫 2.txt

 20000023485 xxx888
 20000012356 xxx888
 20000067234 xxx234

预期输出

 20000023485 xxx888
 20000012356 xxx888

【问题讨论】:

  • 你试过了吗?
  • 好吧,但显然不会工作 grep "$(awk '{num=substr($1,1,3); print num}' 1.txt)" "$(awk ' {num=substr($1,3,7); sub(/^0+/, "", num); print num}' 2.txt)"

标签: awk grep


【解决方案1】:
awk 'FNR==NR {a[substr($1,0,3)];next}
             {match($1, /0+/);
             if(substr($1, RSTART+RLENGTH,3) in a)print}' 1.txt 2.txt

{a[substr($1,0,3)];next} - 将前 3 个字符存储在关联数组中。

match($1, /0+/);if(substr($1, RSTART+RLENGTH,3) in a) 匹配一系列零之后的 3 个字符,并检查这 3 个字符是否存在于之前创建的关联数组中,如果找到匹配则打印整行。

【讨论】:

    【解决方案2】:

    用 grep 试试这个:

    grep -f <(sed 's/^\(...\).*/00\1/' file1) file2
    

    输出:

    20000023485 xxx 20000012356 xxx

    【讨论】:

    • 非常聪明地使用 grep,但我认为这不是 OP 要求的(匹配 2.txt 中零后的前 3 位数字)。也许grep -f &lt;(grep -o '^...' 1.txt | sed 's/^/000/g') 2.txt
    【解决方案3】:

    grep -f 将匹配给定文件中的一系列模式,每行一个。但首先你需要把 1.txt 变成你想要的模式。在您的情况下,您需要 1.txt 每一行的前三个字符,在零之后:00*234、00*123 等(我假设您至少想要一个零。)

    sed -e 's/^\(...\).*$/00*\1/' 1.txt > 1f.txt
    grep -f 1f.txt 2.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2020-05-11
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      相关资源
      最近更新 更多