awk用分隔符连接n个字段

时间:2012-01-24 09:49:14

标签: awk

我如何使用awk加入各个领域,因为我不知道他们有多少?例如,给定输入字符串

aaa/bbb/ccc/ddd/eee

我使用-F'/'作为分隔符,对aaabbbcccdddeee进行一些操作(更改,删除) ...)我想加入它以打印出一些行

AAA/bbb/ddd/e

由于

4 个答案:

答案 0 :(得分:9)

  

......鉴于我不知道他们中有多少人?

啊,但你知道你有多少(a)NF是包含当前记录中字段数的变量,您可以使用for循环来处理它们:

$ echo pax/is/a/love/god | awk -F/ '{
    gsub (/god/,"dog",$5);
    $4 = "";
    $6 = $5;
    $5 = "rabid";
    printf $1;
    for (i = 2; i <= NF; i++) {
        if ($i != "") {
            printf "."$i };
        }
    }
    printf "\n";
}'
pax.is.a.rabid.dog

这显示了对值的操纵,以及插入和删除。


(a)嗯,你很快继续阅读。

答案 1 :(得分:1)

以下内容将向您展示如何处理每个字段并对它们进行一些示例操作。

使用输出字段分隔符OFS的唯一警告是“已删除”字段仍将具有分隔符,如下面的输出所示;但是,如果你可以接受它,它会使代码更简单。

awk '
  BEGIN{FS=OFS="/"}
  {
    for(i=1;i<=NF;i++){
      if($i == "aaa")
        $i=toupper($i)
      else if($i ~ /c/)
        $i=""
      else if($i ~ /^eee$/)
        $i="e"
    }
  }1' <<<'aaa/bbb/ccc/ddd/eee'

输出

AAA/bbb//ddd/e

答案 2 :(得分:0)

awk -F'/' '{ # I'd suggest to add them to an array, like:
             # for (i=1;i<=NF;i++) {a[i]=$i }
             # Now manipulate your elements in the array
             # then finally print them:
             n = asorti(a, dest)
             for (i=1;i<=n;i++) { output+=dest[i] "/") }
             print gensub("/$","","g",output)
           }' INPUTFILE

这样做也可以删除元素。 注意删除项目可以像delete array[index]一样完成。

答案 3 :(得分:0)

这可能对您有用:

echo "aaa/bbb/ccc/ddd/eee" |
awk 'BEGIN{FS=OFS="/"}{sub(/../,"",$4);NF=4;print}'
aaa/bbb/ccc/d

要删除不在最后的字段,请使用一个函数来重排值:

echo "aaa/bbb/ccc/ddd/eee" |
awk 'func d(n){for(x=n;x<=NF-1;x++){y=x+1;$x=$y}NF--};BEGIN{FS=OFS="/"}{d(2);print}'
aaa/ccc/ddd/eee

删除第二个字段。

相关问题