在bash脚本中将列转换为行

时间:2014-04-15 10:40:37

标签: linux bash shell sorting awk

我有一个文件,其中包含mysql表的名称及其列名。我想转换成以下格式

file:example.txt

Table Name        | Column Name
   ABC            |    123
   ABC            |    345
   XYZ            |    111
   FFF            |    222
   FFF            |    333
   FFF            |   4444

输出应为

ABC(123,345)
XYZ(111)
FFF(222,333,4444)

请给我一些例子。

3 个答案:

答案 0 :(得分:3)

$ cat t.awk
#!/usr/bin/awk -f

BEGIN { FS="[ \t|]+" }
NR>1 { a[$1]=a[$1]$2"," }
END {
    for (i in a)
        printf "%s(%s)\n", i, substr(a[i], 0, length(a[i])-1)
}

$ ./t.awk example.txt
ABC(123,345)
XYZ(111)
FFF(222,333,4444)

答案 1 :(得分:2)

有些人喜欢这样:

awk -F"[ \t|]+" 'NR>2 {printf f==$1?"":")\n"} NR>1{printf (f==$1?","$2:$1"("$2)} {f=$1} END {print ")"}' file
ABC(123,345)
XYZ(111)
FFF(222,333,4444)

答案 2 :(得分:0)

Pure bash(4.0 +):

declare -A name                     # associative array

while read  a b c; do
   name[$a]="${name[$a]},$c" 
done < <( tail -n+2 "$infile" )     # skip first line

for nm in ${!name[@]}; do
  echo "$nm(${name[$nm]#,})"        # remove leading comma
done

参数替换会删除前导逗号