awk处理Multiple De-Limiter:

时间:2014-07-21 15:22:53

标签: awk

想知道如果两个文件有不同的限制器,如何处理:

喜欢比较来自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

3 个答案:

答案 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