Windows批处理:替换换行符以创建csv文件

时间:2014-06-26 10:27:30

标签: batch-file awk sed

我有一个输出文件,它是一个解构的csv文件。

a
,b
,c
e
,f
,g
,h
i 
,j 
.......

每行中元素的数量是随机的。每个元素也是随机的。我想用','替换'\ r \ n','。但我找不到这样做的语法.....

a,b,c
e,f,g,h 
i,j 
.......

我无法在服务器上安装第三方实用程序,但可以访问旧版本的unixutils

GNU textutils 1.5
GNU sed version 3.02
GNU Awk 3.1.0

任何帮助都非常感谢!!

7 个答案:

答案 0 :(得分:3)

下面的Windows批处理文件不需要任何第三方实用程序(包括GNU'):

@echo off
setlocal EnableDelayedExpansion

set "out="
for /F "delims=" %%a in (file.txt) do (
   set "in=%%a"
   if "!in:~0,1!" neq "," (
      if defined out echo !out!
      set "out=!in!"
   ) else (
      set "out=!out!!in!"
   )
)
echo !out!

如果行包含感叹号,则此程序将失败。这一点可能是固定的。

答案 1 :(得分:2)

另一个sed选项:

$ sed -ne '/^,/H;/^[^,]/{;x;s/\r\n//g;/./p;};${;x;s/\r\n//g;p;}' input
a,b,c
e,f,g,h
i,j

为便于阅读而分手,以下是这个方法的工作原理:

  • /^,/H; - 对于以逗号开头的任何行,请将其附加到sed" hold"。
  • /^[^,]/{ - 对于任何以逗号开头的行(这意味着我们在前一组输入行的末尾):
    • x; - 交换模式并保留空格(因此下一行的开头位于保留中),
    • s/\r\n//g; - 删除模式中的所有换行符,
    • /./p;}; - 如果此处有一个模式(即不是空行),请将其打印出来。
  • ${x;s/\r\n//g;p} - 然后在文件末尾执行相同操作。

请注意,这应该适用于非GNU sed以及GNU。我在FreeBSD和OSX中进行了测试,但是使用了unix样式的行结尾,然后将\r添加到此答案的替换中。 YMMV。

答案 2 :(得分:1)

这是awk版本

awk 'NR>1 {printf "%s"($0~/^,/?"":RS),a} {a=$0} END {print $0}' file
a,b,c
e,f,g,h
i ,j

输入文件中i后面有空格,未删除。如果你想删除它,请执行:

awk 'NR>1 {printf "%s"($0~/^,/?"":RS),a} {sub(/ +$/,"");a=$0} END {print $0}' file
a,b,c
e,f,g,h
i,j

答案 3 :(得分:0)

我用awk得到了这个:

awk '/,/{x=x$0;next} {if(length(x))print x;x=$0}' file

如果该行上有逗号,请将此行添加到变量x。如果没有,请打印x,如果其中有任何内容,请使用当前行开始新的x

答案 4 :(得分:0)

另一种方式

awk '/,/{x=x$0}!/,/{if(x)print x;x=$0}END{print x}' file

另一个没有空格

awk '/,/{x=x$0}!/,/{x?x=x"\n"$0:x=$0}END{gsub(/ /,"",x);print x}' file

答案 5 :(得分:0)

只需适当设置输入记录分隔符和输出记录分隔符:

awk -v RS='\r\n,' -v ORS=',' '1' file

或者阅读整个文件并进行全局替换:

awk -v RS='^$' '{gsub(/\r\n,/,",")}1' file

根据您运行的平台,您可能需要添加-v BINMODE=3以阻止C utils在awk有机会解析它之前剥离\r

答案 6 :(得分:0)

你也可以使用sed

sed  ':loop ; N ;s/\n//g ; s/\(\w\)\(\w\)/\1\n\2/g ; t loop ' file_name
相关问题