7

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

约翰
30
麦克风
0.0786268
泰森
0.114889
加布里埃尔
0.176072
菲奥娜
0.101895

我需要将每隔一行移到一个新列,所以它应该看起来像这样

约翰 30
迈克 0.0786268
泰森 0.114889
加布里埃尔 0.176072
菲奥娜 0.101895

我刚才awk 'NR%2==0'将每隔一行打印一次,有人可以建议我如何将它们转移到上面的新列。非常感谢任何帮助。

4

8 回答 8

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

Explanation:

  • printf will not include a new line character at the end of line (unlike print)
  • (NR%2?FS:RS) decides new line (RS) or field seperator (FS) based on NR%2

If your colmns should be seperated by \t

awk '{printf "%s%s",$0,NR%2?"\t":RS}'
于 2012-12-29T22:19:46.717 回答
9

xargs 可以做到,命令行真的很短:

xargs -n2 < file
于 2012-12-28T11:03:50.637 回答
1

我很想这样使用sed

sed 'N;s/\n/ /' file

但是,这不会很好地格式化您的数据。您可以将其输入column -t

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

但这似乎没有必要。像这样使用会更好paste

paste - - < file

结果:

John    30
Mike    0.0786268
Tyson   0.114889
Gabriel 0.176072
Fiona   0.101895
于 2012-12-28T10:36:18.843 回答
1
paste - - < file > newfile

paste 默认使用制表符作为分隔符。

于 2012-12-28T17:15:33.283 回答
1

sed 比 awk 做得更好:

sed 'N;s/\n/ /g' yourfile

也在 awk 中:

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

还在这里检查另一个解决方案

于 2012-12-28T09:54:33.747 回答
1

一种方法是:

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

看见

于 2012-12-28T09:53:28.480 回答
0
awk 'NR%2{s=$0; next} {print s, $0}' file

或使用默认操作

awk 'NR%2{s=$0; next} {$0=s" "$0}1' file
于 2012-12-28T16:40:39.980 回答
0

另一种awk解决方案,比最受好评的 IMO 更优雅(至少更短):

$ awk 'ORS=NR%2?FS:RS' file
John 30
Mike 0.0786268
Tyson 0.114889
Gabriel 0.176072
Fiona 0.101895
于 2021-09-12T09:50:46.383 回答