2

我是 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 列。我很感激任何帮助。

4

3 回答 3

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]}' 
于 2013-07-30T17:08:36.627 回答
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. 为每个(键)创建一个数组元素$1 ";" $3,并将第二列附加到它的值。
  2. END 循环遍历数组的键,打印键和值。
于 2013-07-30T16:57:41.873 回答
0

(我忽略了使用分号作为输出字段分隔符的要求。因为我在下面使用连接键,我发现内联管理分号比在 BEGIN 块中声明 OFS 更容易。)

为数组构建连接键。将第二列连接到数组中的现有值。将每个键和值打印到标准输出。

$ 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 
于 2013-07-30T17:14:27.157 回答