我有制表符分隔的.txt文件,如下所示:
""
"5 um"
"Lipid droplet number"
"Lipid droplet diameter"
"Mito"
22
0
5 um
64 255 0 0
2
1615 2022
2037 2021
1
Lipid droplet number
64 255 0 0
1
583 1945
0
Lipid droplet diameter
64 255 0 0
2
1406 849
1364 882
0
Lipid droplet diameter
64 255 0 0
2
1105 1333
1082 1369
0
Lipid droplet diameter
64 255 0 0
2
619 1932
580 1953
0
我想创建一个新的.txt文件,包括所有地方的第2和第3行,其中rowname为“Lipid droplet diameter”。
结果应该是这样的:(我想删除除直径信息之外的所有其他行)
1406 849
1364 882
1105 1333
1082 1369
619 1932
580 1953
2列和2行是可以的。 4列和1行也可以。我认为这个最适合Excel。
答案 0 :(得分:1)
丑陋的getline awk
awk '/diameter/ {getline;getline;getline;a=a?a" "$0:$0;getline;b=b?b" "$0:$0} END {print a"\n"b}' file
1406 849 1105 1333 619 1932
1364 882 1082 1369 580 1953
更好的版本
awk '/diameter/ {f=NR} f && f+3==NR {a=a?a" "$0:$0} f && f+4==NR {b=b?b" "$0:$0} END {print a"\n"b}' file
1406 849 1105 1333 619 1932
1364 882 1082 1369 580 1953
更好的表格视图:
awk '/diameter/ {f=NR} f && f+3==NR {a=a?a"\t"$0:$0} f && f+4==NR {b=b?b"\t"$0:$0} END {print "Column1\t\tColumn2\t\tColumn3\n" a"\n"b}' file
Column1 Column2 Column3
1406 849 1105 1333 619 1932
1364 882 1082 1369 580 1953
答案 1 :(得分:1)
对于变量行和列,您可以尝试:
BEGIN {
OFS="\t"; SUBSEP="@"; MAXROWS=1000
}
/^Lipid droplet diameter$/ {
cols++; rows=0
while (NF != 2) getline
while (NF == 2 && rows < MAXROWS) {
vectors[cols, ++rows] = $0
getline
}
}
END {
for (c = 1; c <= cols; c++) printf("Column%i%c", c, c<cols ? OFS : "\n")
for (r = 1; r <= rows; r++) {
for (c = 1; c <= cols; c++) printf("%s%c", vectors[c, r], c<cols ? OFS : "\n")
}
}
示例假设上述内容保存为lipid.awk
:
awk -f lipid.awk input
答案 2 :(得分:1)
使用sed:
sed -n '/Lipid droplet diameter/{n;n;n;N;p}' input
给出:
1406 849
1364 882
1105 1333
1082 1369
619 1932
580 1953
另一种方法:
grep -A 4 'Lipid droplet diameter' input | sed -n '/--/!p' | \
awk ' (NR-1)%5>2 { print }'