在某些列的同一行上打印awk输出

时间:2017-01-20 15:07:38

标签: html awk

我有一个文件说测试,输出如下

vserver    share-name     path           acl 
TEST_SERVER TEST_SHARE_PATH /TEST/TESTSHAREPATH "test\testuser / Read","test\testuser1_R / Read","test\testuser2_RW / Change"

由于acl很大,它在vserver下的新行中正确对齐。但我希望这可以像这样进入acl。

  vserver     share-name                path                acl 

 TEST_SERVER TEST_SHARE_PATH /TEST/TESTSHAREPATH  "test\testuser /Read",
                                                  "test\testuser1 R /Read",
                                                  "test\testuser1 RW / Change"

请帮助

1 个答案:

答案 0 :(得分:2)

将GNU awk用于FPAT和gensub():

$ cat tst.awk
BEGIN { OFS="\t" }
NR==1 {
    $1=$1
    print
    FPAT = "([^,]*)|(\"[^\"]+\")"
    next
}
{
    n  = split(gensub(/ ".*/,"",1),f,/ /)
    $1 = gensub(/[^"]+/,"",1,$1)
    for (i=1; i<=NF; i++) {
        for (j=1; j<=n; j++) {
            printf "%s%s", f[j], OFS
        }
        print  $i
        delete f
    }
}

$ awk -f tst.awk file | column -s$'\t' -t
vserver      share-name       path                 acl
TEST_SERVER  TEST_SHARE_PATH  /TEST/TESTSHAREPATH  "test\testuser / Read"
                                                   "test\testuser1_R / Read"
                                                   "test\testuser2_RW / Change"

以上假设您的输入数据中没有标签。如果有,那么为OFS挑选一些其他角色。