我有一个如下文件,想要在找到专线时更改为列(此处为del_size fq
)。
$ cat file.txt
del_size fq
0 13452
-1 13034
del_size fq
0 13
-1 0
-2 2155
del_size fq
0 6600
-1 8
-2 0
非常感谢任何帮助。 感谢。
答案 0 :(得分:0)
复杂的GNU awk
解决方案:
awk '{
if (/^del_size/) {
h = (h? h OFS : "") $0; cnt++;
if (r_cnt > max_rows) max_rows = r_cnt;
i = j = r_cnt = 0
}
else {
arr[cnt][++i] = $0;
r_cnt++
}
next
}
END{
print h;
for (i = 1; i <= max_rows; i++) {
for (j = 1; j <= cnt; j++) {
items = arr[j][i];
if (items == "") items = "" OFS "";
printf "%s%s", (j == 1 ? "" : OFS), items
}
print ""
}
}' OFS='\t' file
输出:
del_size fq del_size fq del_size fq
0 13452 0 13 0 6600
-1 13034 -1 0 -1 8
-2 2155 -2 0
答案 1 :(得分:0)
这将使用任何UNIX框上的任何shell中的任何awk来生成以制表符分隔的输出,然后您可以将其导入到列或导入Excel或之后需要执行的任何操作:
$ cat tst.awk
BEGIN { OFS="\t" }
/^del_size/ { ++numCols; rowNr=0 }
{ $1 = $1 }
NR==1 {
empty = $0
gsub(/[^[:space:]]+/,"",empty)
}
{
cell[++rowNr,numCols] = $0
numRows = (rowNr > numRows ? rowNr : numRows)
}
END {
for (rowNr=1; rowNr<=numRows; rowNr++) {
for (colNr=1; colNr<=numCols; colNr++) {
val = ((rowNr,colNr) in cell ? cell[rowNr,colNr] : empty)
printf "%s%s", val, (colNr<numCols ? OFS : ORS)
}
}
}
$ awk -f tst.awk file | column -s$'\t' -t
del_size fq del_size fq del_size fq
0 13452 0 13 0 6600
-1 13034 -1 0 -1 8
-2 2155 -2 0