使用awk将每隔一行移动到一个新列

时间:2012-12-28 09:43:50

标签: 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

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

7 个答案:

答案 0 :(得分:8)

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

说明:

  • printf不会在行尾包含换行符号(与print不同)
  • (NR%2?FS:RS)根据NR%2
  • 决定新行(RS)或字段分隔符(FS)

如果您的colmns应该由\t

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

答案 1 :(得分:5)

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

xargs -n2 < file

答案 2 :(得分:1)

一种方法是:

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

See it

答案 3 :(得分: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

答案 4 :(得分:0)

除了awk之外,最好这样做:

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

也在awk中:

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

还要检查另一个解决方案here

答案 5 :(得分:0)

awk 'NR%2{s=$0; next} {print s, $0}' file

或使用default action

awk 'NR%2{s=$0; next} {$0=s" "$0}1' file

答案 6 :(得分:0)

paste - - < file > newfile

默认情况下,粘贴使用tab作为分隔符。