我有一个按行生成的报告,我需要将其移至列。每条记录的行数始终相同。这将位于 Linux 上的 bash 脚本中,因此我想使用可用的标准工具。我偏爱awk
和sed
。
我需要改变这个:
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=";"文件名