我有第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 ++应用程序?
答案 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
这会将后续记录的第一列追加到第一个记录,直到第二个和第三个键发生更改。然后重新排列并打印出第一条记录中的字段。
这使用了所提供的数据,但可以适应更复杂的数据。