通过空格分隔文件上的两个字段对元素进行分组

时间:2014-08-08 14:59:20

标签: bash awk sed

我有第2列的排序数据,然后是3,然后是空格分隔文件中的1(我使用linux排序来执行此操作):

0 0 2
1 0 2
2 0 2
1 1 4
2 1 4

我想创建一个新文件(保留旧文件)

0 2 0,1,2
1 4 1,2

基本上首先放置字段2和3,然后按字段1对字段1的元素(以逗号分隔列表)进行分组。有没有办法用awk,sed,bash one liner做到这一点,所以为了避免为此编写Java,C ++应用程序?

6 个答案:

答案 0 :(得分:2)

由于文件已经订购,您可以在更改时打印该行:

awk '
  seen==$2 FS $3 { line=line "," $1; next }
  { if(seen) print seen, line; seen=$2 FS $3; line=$1 }
  END { print seen, line }
' file
0 2 0,1,2
1 4 1,2

这将保留输出顺序。

答案 1 :(得分:1)

使用awk

awk '{k=$2 OFS $3} !(k in a){a[k]=$1; b[++n]=k; next} {a[k]=a[k] "," $1}
     END{for (i=1; i<=n; i++) print b[i],a[b[i]]}' file
0 2 0,1,2
1 4 1,2

答案 2 :(得分:1)

使用您的输入和输出这一行可能会有所帮助:

 awk '{f=$2 FS $3}!(f in a){i[++p]=f;a[f]=$1;next}
      {a[f]=a[f]","$1}END{for(x=1;x<=p;x++)print i[x],a[i[x]]}' file

试验:

kent$  cat f
0 0 2
1 0 2
2 0 2
1 1 4
2 1 4

kent$  awk '{f=$2 FS $3}!(f in a){i[++p]=f;a[f]=$1;next}{a[f]=a[f]","$1}END{for(x=1;x<=p;x++)print i[x],a[i[x]]}' f
0 2 0,1,2
1 4 1,2

答案 3 :(得分:1)

awk 'a[$2, $3]++ { p = p "," $1; next } p { print p } { p = $2 FS $3 FS $1 } END { if (p) print p }' file

输出:

0 2 0,1,2
1 4 1,2
  • 解决方案假设第二列和第三列的数据已排序。

答案 4 :(得分:0)

还有另一种看法:

awk -v SUBSEP=" " '
    {group[$2,$3] = group[$2,$3] $1 ","} 
    END {
        for (g in group) {
            sub(/,$/,"",group[g])
            print g, group[g]
        }
    }
' file > newfile

SUBSEP变量是在一维awk数组中连接字符串的字符 http://www.gnu.org/software/gawk/manual/html_node/Multidimensional.html#Multidimensional

答案 5 :(得分:0)

这可能适合你(GNU sed):

sed -r ':a;$!N;/(. (. .).*)\n(.) \2.*/s//\1,\3/;ta;s/(.) (.) (.)/\2 \3 \1/;P;D' file

这会将后续记录的第一列追加到第一个记录,直到第二个和第三个键发生更改。然后重新排列并打印出第一条记录中的字段。

这使用了所提供的数据,但可以适应更复杂的数据。