使用 SED 或 AWK 将行移动到列

使用 SED 或 AWK 将行移动到列

我有一个按行生成的报告,我需要将其移至列。每条记录的行数始终相同。这将位于 Linux 上的 bash 脚本中,因此我想使用可用的标准工具。我偏爱awksed

我需要改变这个:

R1
R2
R3
R4
R5
R6
R7
R1
R2
R3
R4
R5
R6
R7

对此:

R1,R2,R3,R4,R5,R6,R7
R1,R2,R3,R4,R5,R6,R7

任何帮助将不胜感激。

有几个人向我推荐了一些非常好的例子,这些例子确实适用于上述数据。不幸的是,我的数据更可靠一些。下面是我正在使用的半真实世界的例子。

这:

00000
ND00000056888
Doe, Jane J
F
99 Y
09/01/2014 8:01:08 AM
EE
00001
ND00000056889
Doe, John J
M
66 Y
09/02/2014 5:01:08 PM
DD

到:

00000;ND00000056888;Doe, Jane J;F;99 Y;09/01/2014 8:01:08 AM;EE
00001;ND00000056889;Doe, John J;M;66 Y;09/02/2014 5:01:08 PM;DD

除逗号或单个空格之外的任何分隔符都可以。

答案1

尝试

 awk '{printf "%s%s",$0,NR%7?",":"\n" ; }' 

最重要的部分

  • NR%7?",":"\n":如果-那么-否则:
    • if (NR%7) : NR, (记录数) % (模) 7 (除以 7 != 0 )
    • 然后 printf 一个 ','
    • 否则新线。
  • $0是整条线

答案2

如果您不沉迷于 sed 或 awk,请使用粘贴

echo "R1
R2
R3
R4
R5
R6
R7
R1
R2
R3
R4
R5
R6
R7" | paste -d, - - - - - - -
R1,R2,R3,R4,R5,R6,R7
R1,R2,R3,R4,R5,R6,R7

您的第二个示例没有任何困难,只需引用分号,这样 shell 就看不到它:

paste -d ';' - - - - - - - <filename
00000;ND00000056888;Doe, Jane J;F;99 Y;09/01/2014 8:01:08 AM;EE
00001;ND00000056889;Doe, John J;M;66 Y;09/02/2014 5:01:08 PM;DD

答案3

awk '{ ORS=NR%7?",":"\n" }1'是 awk 的另一种方式。

答案4

还有另一种方式:

pr -a7 -l1 -s";"文件名

这是缩写

pr --columns=7 --across --length=1 --separator=";"文件名

相关内容