2013-01-17 77 views
-4

我最近在同一论坛上提出了一个问题,并找到了解决方案。不幸的是,它必须转换成UNIX。问题是合并来自csv文件的行。每行应以分号(;)结尾,并且如果它未将下一行组合到它中,则再次找到分号。将合并行批处理脚本转换为shell

为我工作的解决方案是

@echo off 
setlocal disableDelayedExpansion 
set "ln=" 
for /f delims^=^ eol^= %%i in (myfile.txt) do (
    set "var=%%i" 
    setlocal enableDelayedExpansion 
    if "!var:~-1!"==";" (echo !var!>>temp.csv) else (<nul set /p ="!var!">>temp.csv) 
    endlocal 
) 

是否可以转换为UNIX脚本?

链接到原来的职位是:Merge line with the next line if last character is a semicolon using batch file

+3

是的,这是可能的。你有什么尝试? – chepner

+1

没有“Unix脚本”这样的东西。有脚本语言,shell,流水线实用程序和多种编程语言。做一些研究并编写一些代码,那么你将能够更好地提出良好的Stack Overflow问题。 –

回答

0

,如果你想要做文本处理接下来的时间,不要去窗口。 :d

因为您有:

A;1;abc;<xml/>; 
;2;def;<xml 
>hello world</xml>; 
;3;ghi;<xml/>; 

您的规则是:

我需要结合线等,如果该行不结束与 分号(;)结束,将下一行组合到当前行中。

awk '!/;$/{l=l""$0;next;}{print l""$0;l=""}' file 

测试

kent$ echo "A;1;abc;<xml/>; 
;2;def;<xml 
>hello world</xml>; 
;3;ghi;<xml/>;"|awk '!/;$/{l=l""$0;next;}{print l""$0;l=""}' 
A;1;abc;<xml/>; 
;2;def;<xml>hello world</xml>; 
;3;ghi;<xml/>; 

,它工作在这种情况下也:

kent$ cat ttt 
A;1;abc;<xml/>; 
;2;def;<xml 
>h 
e 
l 
l 
o w 
o 
rld< 
/xm 
l>; 
;3;ghi;<xml/>; 

kent$ awk '!/;$/{l=l""$0;next;}{print l""$0;l=""}' ttt 
A;1;abc;<xml/>; 
;2;def;<xml>hello world</xml>; 
;3;ghi;<xml/>; 
+0

谢谢@Kent。由于CSV文件的每一行都非常大,因此我收到有关数据大小的错误。我发现我可能需要使用perl。是否有可能与perl使用相同的正则表达式? – Junaid

0

sed的将是我的选择。

sed ':a;/[^;]$/{N;s/\n//;ta}' x.txt 

sed的读取每一行,并为每一个 设置一个标记(:1) 然后检查是否线路缺少; (/ [^;] $ /) 如果它没有; N读入下一行,并用分隔它们的新行将它追加到当前行。 s/\ n //删除换行符 ta检查替换是否成功,如果跳转到:a标签再次开始检查

+0

谢谢@peteches。由于CSV文件的每一行都非常大,因此我收到有关数据大小的错误。我发现我可能需要使用perl。是否有可能与perl使用相同的正则表达式? – Junaid

相关问题