输入:两个制表符分隔的文件,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"$3
a
使用第二个和第三个字段填充数组,并使用第一个字段作为索引。
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
从管道结构中获取该命令。