想知道如果两个文件有不同的限制器,如何处理:
喜欢比较来自F11.txt的第二个字段 - substr($ 2,3,2),取消限制为“|”来自F22.txt的第一个字段,由“,”解除限制,然后仅从两个文件打印匹配案例:
输入:
F11.txt
a|mm10|zzz
b|mm20|zzz
c|mm50|zzz
F22.txt
10,yyy
20,yyy
30,yyy
40,yyy
尝试了如下所示并进一步继续:
awk ' BEGIN {FS = OFS = ","} FNR==NR {a[$1] = $0; next} (substr($2,3,2) in a) {print $0, a[$2]}' f22.txt f11.txt
期望的输出:
a,10,zzz,10,yyy
b,20,zzz,20,yyy
答案 0 :(得分:1)
这样做的方法是只更改文件之间的分隔符:
awk '...' FS="," file1 FS="|" file2
e.g。
$ awk -v OFS="," '
NR==FNR { a[$1]=$2; next }
{ $2=substr($2,3,2); if ($2 in a) print $0, $2, a[$2] }
' FS="," f22.txt FS="|" f11.txt
a,10,zzz,10,yyy
b,20,zzz,20,yyy
答案 1 :(得分:0)
这有点棘手......但它有效:)
awk -v FS="|" -v OFS=","
'BEGIN{s=""}
FNR==NR{b=substr($2,3,2)
$2=b
for (i=1; i<=NF; i++) s=s""$i""OFS
a[b]=s
s=""
next}
($1 in a) {print a[$1] $0}' f1 FS="," OFS= f2
它为每个文件使用不同的FS和OFS,以便正确完成处理。然后,将f1的每一行存储在数组a[substr($2,3,2)]
上,以便我们可以检测该值是否在第二个文件的第一个字段中。
$ awk -v FS="|" -v OFS="," 'BEGIN{s=""} FNR==NR{b=substr($2,3,2); $2=b; for (i=1; i<=NF; i++) s=s""$i""OFS; a[b]=s; s=""; next} ($1 in a) {print a[$1], $0}' f1 FS="," OFS= f2
a,10,zzz,10,yyy
b,20,zzz,20,yyy
答案 2 :(得分:0)
使用sed
进行修改,然后使用join
:
sed 's/|/,/g;s/[a-z]*//2' file1|join -1 2 -2 1 -t, -o 1.1,1.2,1.3,2.1,2.2 - file2
a,10,zzz,10,yyy
b,20,zzz,20,yyy