我有一个输出文件,它是一个解构的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
任何帮助都非常感谢!!
答案 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