Sed 从多个表中提取第二列并以制表符分隔打印它们
一个输入文件包含多个由Sed 从多个表中提取第二列并以制表符分隔打印它们,sed,awk,multiple-columns,text-parsing,Sed,Awk,Multiple Columns,Text Parsing,一个输入文件包含多个由--分隔的表。每个表包含3列。我想从每个表中选取第二列,并在表选项卡上以分隔符打印列值 输入文件: 402 52 2 403 68 0 404 0 0 405 0 0 407 1 3 -- 1315 0 0 1316 0 0 1317 335 0 1318 2 3 1319 0 0 -- 189
--
分隔的表。每个表包含3列。我想从每个表中选取第二列,并在表选项卡上以分隔符打印列值
输入文件:
402 52 2
403 68 0
404 0 0
405 0 0
407 1 3
--
1315 0 0
1316 0 0
1317 335 0
1318 2 3
1319 0 0
--
1892 0 0
1893 1 4
1894 0 0
1895 920 0
1896 2 3
输出文件:
52 0 0
68 0 1
0 335 0
0 2 920
1 0 2
请建议使用
awk
或sed
命令。谢谢。使用以下awk脚本:
#!/usr/bin/awk
BEGIN { nc=1; nr_ = 1; maxr = 1;}
/^--$/ {
if (maxr < nr_ )
maxr = nr_;
nc++; nr_=1;
next;
}
{ col[nc, nr_++] = $2; }
END {
for(r = 1; r < maxr ; r++) {
for(c = 1; c < nc - 1; c++) {
printf("%s\t", col[c, r]);
}
printf("%s\n", col[nc-1, r]);
}
}
#/usr/bin/awk
开始{nc=1;nr=1;maxr=1;}
/^--$/ {
如果(最大值
这里是另一种方式:
$ awk '
NF>1{++count; col[count]=(flag)?col[count] "\t" $2:$2; next}
{max=(max>count)?max:count; count=0; flag=1}
END{for(c=1;c<=max;c++) print col[c]}' file
52 0 0
68 0 1
0 335 0
0 2 920
1 0 2
$awk'
NF>1{++count;col[count]=(标志)?col[count]“\t”$2:$2;next}
{max=(max>count)?max:count;count=0;flag=1}
END{for(c=1;c由于数据是重复的,您可以这样做:
awk 'NR%6 {if (NR%6==1) f++;a[f FS NR%6]=$2} END {for (i=1;i<=6;i++) {for (j=1;j<=f;j++) printf "%s\t",a[j FS i];print ""}}' file
52 0 0
68 0 1
0 335 0
0 2 920
1 0 2
awk'NR%6{if(NR%6==1)f++;a[f FS NR%6]=$2}END{for(i=1;编写这个程序很有帮助。它正在工作。@FIROZ:如果这个答案解决了您的问题,请单击旁边的大复选标记接受它。此外,如果其他答案也有帮助,您可以投票给他们。+1;做得很好:更简洁、更高效;您通过收集列v来建立输出行在一维数组中逐行跨表的值(但最好使用更具描述性的变量名:)
awk '
NR%6 {
if (NR%6==1)
f++
a[f FS NR%6]=$2}
END {
for (i=1;i<=6;i++) {
for (j=1;j<=f;j++) printf "%s\t",a[j FS i]
print ""}
}' file