我是shell命令的新手,我试图采取以下措施:
05 ; 47.89 ; 971
05 ; 49.23 ; 971
05 ; 1.44 ; 971
10 ; 61.42 ; 508
10 ; 37.40 ; 508
10 ; 0.39 ; 508
15 ; 45.09 ; 173
15 ; 52.60 ; 173
15 ; 0.00 ; 173
输出:
05 ; 971 ; 47.89 ; 49.23 ; 1.44
10 ; 508 ; 61.42 ; 37.40 ; 0.39
15 ; 173 ; 45.09 ; 52.60 ; 0.00
到目前为止,我试过了:
awk -F';' '{ x[$1]=x[$1] " " $2; y[$2]=y[$2] " " $1; } END { for (k in x) print k,x[k];}' graphtemp.txt
我知道不会根据需要打印第3列。我感谢任何帮助。
答案 0 :(得分:2)
试试这个awk命令:
awk 'BEGIN{FS=OFS=";"} {c=$1 FS $3; if (c in a) a[c]=a[c] FS $2; else a[c]=$2}
END{for (k in a) print k, a[k]}' file
编辑:看起来您在每行末尾都有\r\n
,请尝试修改此代码:
awk -F '[ ;\r]+' 'BEGIN{OFS=";"} {c=$1 OFS $3;
if (c in a) a[c]=a[c] OFS $2; else a[c]=$2} END{for (k in a) print k, a[k]}'
答案 1 :(得分:0)
awk -F' *; *' '{a[$1 ";" $3]=a[$1 ";" $3] ";" $2} END {for (k in a) {print k a[k]}}' INPUTFILE
如果您确实拥有确切的输入文件格式,这可能适合您/给您一个起点。
请参阅此处的操作:http://ideone.com/r44wjm
注意:这会给你一个未排序的输出(你可以用(g)awk对数组进行排序,但我把它留给你。
工作原理:
$1 ";" $3
(键)创建一个数组元素,并将第二列附加到其值。答案 2 :(得分:0)
(我忽略了使用分号作为输出字段分隔符的要求。因为我使用下面的连接键,我发现更容易管理分号内联而不是在BEGIN块中声明OFS。)
为数组构建连接键。将第二列连接到数组中的现有值。将每个键和值打印到stdout。
$ cat test.awk
{
x = sprintf("%s ; %s", $1, $3)
if (x in a )
a[x] = sprintf("%s ; %s", a[x], $2)
else
a[x] = "; " $2
}
END {
for (k in a) print k, a[k]
}
为方便起见排序。输入文件中第一列和第三列的值有多少并不重要。
$ awk -F";" -f test.awk test.dat | sort
05 ; 971 ; 47.89 ; 49.23 ; 1.44
10 ; 508 ; 61.42 ; 37.40 ; 0.39
15 ; 173 ; 45.09 ; 52.60 ; 0.00