使用awk / sed更改表的格式

时间:2015-05-12 01:15:46

标签: bash awk sed

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

conf_file = open(config_file)
conf = json.load(conf_file)
# get the search pattern
Search_Pattern=conf["Pattern"]
# convert unicode to ascii
Search_Pattern_ascii=Search_Pattern.encode('ascii','ignore')
#convert ascii string to hex data
Search_Pattern_hex=Search_Pattern_ascii.decode("hex")
#
Search_Pattern_Binary = bytearray()
Search_Pattern_Binary.extend(Search_Pattern_hex)

infile = open(Bin_file,'rb')
buff = infile.read()
Address = buff.find(Search_Pattern_Binary)

....

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

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

1)从输入文件中,$ 1,$ 2和$ 3成为输出文件的标题。 $ 1和#34;:" $ 2#34; - " $ 3'/ P>

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

3)输入文件的$ 5成为表中的值,根据哪个行名称和它对应的列名填写输出表。

由于我们不知道输出表将有多少列或行而不经过输入文件至少一次,我开始获取列名称

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

和ID

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

通过运行一次文件可以解决问题吗?我无法想到使用awk / sed实现它的方法..

2 个答案:

答案 0 :(得分:1)

使用两个不同的数组。在文件处理期间分配它们,并在最后循环它们。

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 

答案 1 :(得分:1)

$ 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