使用Awk/sed更改表格的格式



我有一个输入文件(input.txt):

col1 1 10 ID1 1.5
col1 1 10 ID2 2.4
col2 15 25 ID1 2.1
col2 15 25 ID2 6.2
col3 30 40 ID1 0.4
col3 30 40 ID2 1.9
col4 45 55 ID1 0.1
col4 45 55 ID2 0.2

,我需要将上表的格式更改为如下:

ID col1:1-10 col2:15-25 col3:30-40 col4:45-55
ID1 1.5 2.1 0.4 0.1
ID2 2.4 6.2 1.9 0.2

1)从输入文件中,$ 1,$ 2和$ 3成为输出文件的标题。$ 1":" $ 2" - " $ 3

2)输入文件的$ 4变为行名

3)输入文件的$ 5变为表中的值,取决于输出表,具体取决于哪个行名称以及其哪个列名对应于。

由于我们不知道输出表将有多少列或行,而无需至少浏览输入文件一次,所以我开始获取列名称

awk '{a[$1,":",$2,"-",$3]++} END {for(b in a) { print b} }' input.txt 
col1:1-10
col4:45-55
col3:30-40
col2:15-25

和IDS

awk '{a[$4]++} END {for(b in a) { print b} }' input.txt
ID1
ID2

可以通过一次通过文件解决问题吗?我真的无法想到一种使用Awk/sed来完成它的方法。

$ cat tst.awk
{
    numCols = ++colCnt[$4] + 1
    numRows = ++rowCnt[$1] + 1
    cell[1,1] = "ID"
    cell[1,numCols] = $1":"$2"-"$3
    cell[numRows,1] = $4
    cell[numRows,numCols] = $5
}
END {
    for (rowNr=1; rowNr<=numRows; rowNr++) {
        for (colNr=1; colNr<=numCols; colNr++) {
            printf "%s%s", cell[rowNr,colNr], (colNr<numCols?OFS:ORS)
        }
    }
}
$ awk -f tst.awk file
ID col1:1-10 col2:15-25 col3:30-40 col4:45-55
ID1 1.5 2.1 0.4 0.1
ID2 2.4 6.2 1.9 0.2

使用两个不同的数组。在文件处理过程中分配两个,然后在末尾循环。

awk '{colnum = substr($1, 4); if (colnum > maxcol) maxcol = colnum;
      cols[colnum]  = $1 ":" $2 "-" $3; 
      ids[$4] = ids[$4] " " $5} 
     END {for(i = 1; i <= maxcol; i++) print cols[i];
          for (id in ids) print id, ids[id] }' input.txt 

相关内容

  • 没有找到相关文章

最新更新