【问题标题】:convert columns into rows in bash script在bash脚本中将列转换为行
【发布时间】:2014-04-15 10:40:36
【问题描述】:

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

文件: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)

请给我一些例子。

【问题讨论】:

  • 到目前为止你尝试了什么?请注意,在这个网站上找到相关答案并不复杂,您检查了吗?
  • 我没有发现任何有用的东西,请您推荐我

标签: linux bash shell sorting awk


【解决方案1】:
$ 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)

【讨论】:

    【解决方案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)
    

    【讨论】:

    • 这是一个很好的解决方案,但它假定第一列中所有出现的键都是连续出现的。目前尚不清楚这是一个有效的假设。
    【解决方案3】:

    纯 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
    

    参数替换去掉前导逗号

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 2022-06-15
      相关资源
      最近更新 更多