如果模式匹配,则合并来自不同文件的行

如果模式匹配,则合并来自不同文件的行

输入:两个制表符分隔的文件,File1以及File2. File2( $2) 必须通过File1( $1) 中找到的模式进行解析。

预期输出:制表符分隔文件,File3.File3必须包含与 相同的行File2,如果模式匹配则加上相应的值File1(行尾,制表符分隔)。

文件 1(制表符分隔):

ABC1    1    3
ABC2    4    3
ABC3    3    2
ABC4    3    3

文件2(制表符分隔):

text1   ABC1-AB   text2   text3
text2   ABC2-AB   text1   
text3   ABC1-CD   text2
text4   ABC5-AB   text3   text4

文件3:

text1   ABC1-AB   text2   text3    1    3
text2   ABC2-AB   text1    4    3
text3   ABC1-CD   text2    1    3
text4   ABC5-AB   text3   text4

答案1

awk

awk 'FNR==NR{a[$1]=$2"\t"$3} FNR!=NR{split($2,b,"-"); $0=$0"\t"a[b[1]];print}' file1 file2
  • FNR==NR适用于第一个文件file1
    • a[$1]=$2"\t"$3a使用第二个和第三个字段填充数组,并使用第一个字段作为索引。
  • FNR!=NR适用于第二个文件file2
    • split($2,b,"-")在 处分割第二个字段-
    • $0=$0"\t"a[b[1]]将两个值附加到该行。
    • print打印该行。

输出:

text1   ABC1-AB text2   text3   1   3
text2   ABC2-AB text1   4   3
text3   ABC1-CD text2   1   3
text4   ABC5-AB text3   text4

答案2

使用 BASH 进行测试。

while read LINEFILE2
do
  printf "$LINEFILE2" >> File3
  while read LINEFILE1
  do
    read PATTERN ADDITIONS <<EOF
$LINEFILE1
EOF
    [ ! -z "$PATTERN" ] && [ ! -z $(echo "$LINEFILE2" | cut -f2 | grep "$PATTERN") ] && {
      printf "\t$ADDITIONS\n" >> File3
    }
  done < File1
done < File2

如果您希望在整行内部而不是仅在第 2 列中找到该模式,您可以cut从管道结构中获取该命令。

相关内容