【问题标题】:awk to handle Multiple De-Limiter:awk 处理多个 De-Limiter:
【发布时间】:2014-07-22 00:01:31
【问题描述】:

想知道如果两个文件有不同的分隔符如何处理:

喜欢比较第二个字段 - substr($2,3,2)from F11.txt ,用“|”分隔和 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

【问题讨论】:

    标签: awk


    【解决方案1】:

    这样做的方法是更改​​文件之间的分隔符:

    awk '...' FS="," file1 FS="|" file2
    

    例如

    $ 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
    

    【讨论】:

    • 是的,我就是这么做的,我记得你评论说这在某些情况下很方便,而这就是其中之一。那么'...' 就是丛林。
    • 不,很简单,我刚贴出来。
    【解决方案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
    

    它对每个文件使用不同的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
    

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-18
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多