使用awk将第二行移动到新列

使用awk将第二行移动到新列,awk,Awk,这是另一个noob问题。我有一个这样的文件 John 30 Mike 0.0786268 Tyson 0.114889 Gabriel 0.176072 Fiona 0.101895 John 30 Mike 0.0786268 Tyson 0.114889 Gabriel 0.176072 Fiona 0.101895 约翰 30 迈克 0.0786268 泰森 0.114889 加布里埃尔 0.176072 Fiona 0.101895 我需要将每第二行移到一个新列,这样它应该

这是另一个noob问题。我有一个这样的文件

John 30 Mike 0.0786268 Tyson 0.114889 Gabriel 0.176072 Fiona 0.101895 John 30 Mike 0.0786268 Tyson 0.114889 Gabriel 0.176072 Fiona 0.101895 约翰 30 迈克 0.0786268 泰森 0.114889 加布里埃尔 0.176072 Fiona 0.101895 我需要将每第二行移到一个新列,这样它应该是这样的

John 30 Mike 0.0786268 Tyson 0.114889 Gabriel 0.176072 Fiona 0.101895 John 30 Mike 0.0786268 Tyson 0.114889 Gabriel 0.176072 Fiona 0.101895 约翰30 麦克0.0786268 泰森0.114889 加布里埃尔0.176072 菲奥娜0.101895 我刚才说,
awk'NR%2==0'
将每隔一行打印一次,是否有人可以建议我如何将它们移到如上所述的新列。非常感谢您的帮助

一种方法是:

awk '{ printf("%-10s ",$0); if(NR%2==0) printf("\n");}' file

sed比awk更好:

sed 'N;s/\n/ /g' yourfile
同样在awk中:

awk '{if(NR%2!=0){p=""}else{p="\n"};printf $0" "p}' your_file

还要检查另一个解决方案

我很想像这样使用
sed

sed 'N;s/\n/ /' file
paste - - < file
但是,这并不能很好地格式化数据。您可以将其导入
列-t

< file sed 'N;s/\n/ /' | column -t
结果:

John    30
Mike    0.0786268
Tyson   0.114889
Gabriel 0.176072
Fiona   0.101895

xargs可以做到,命令行非常短:

xargs -n2 < file
xargs-n2
或使用

粘贴---newfile
默认情况下,“粘贴”使用选项卡作为分隔符

awk '{printf "%s%s",$0,(NR%2?FS:RS)}' file

说明:

  • printf
    不会在行尾包含新行字符(与
    print
    不同)
  • (NR%2?FS:RS)
    根据NR%2决定新行(RS)或字段分隔符(FS)
如果您的列应由
\t

awk '{printf "%s%s",$0,NR%2?"\t":RS}'

谢谢你的一行,它真的很好用。我刚刚开始学习awk,如果我能再问你一点的话,我想printf(“%-10s”,0美元)会把所有的东西都打印在一行中,但之后我就不明白了。再次感谢。
printf
打印时不带换行符,
%s
是字符串的格式规范<代码>%-10s将填充长度为10的空格、左对齐或截断更长的字符串。实际上,我会使用
printf(“%s”,$0)
,在%s后面加一个空格,或者加一个制表符,
\t
。printf是一个内置的,不是一个函数,所以()不做你认为他们做的事情,后面的分号是超级的,而打印换行的方式是
print”“
,但不是特定于awk:sed做这件事并不比awk好,因为这与您在awk中做这件事的方式还不太接近。这是对awk最优秀、最优雅的说明。没有其他解决办法,这对我很有帮助。谢谢@ed MortonI我知道这并不奇怪,但我喜欢这个答案。聪明!
awk '{printf "%s%s",$0,NR%2?"\t":RS}'