我最近在同一个论坛上提出了一个问题并找到了解决方案。不幸的是,它必须转换为UNIX。问题是合并csv文件中的行。每一行应以分号(;)结尾,如果它没有将下一行组合到其中,直到再次找到分号。
对我有用的解决方案是
@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
答案 0 :(得分:0)
下次如果要进行文本处理,请不要转到windows。 :d
鉴于你有:
A;1;abc;<xml/>;
;2;def;<xml
>hello world</xml>;
;3;ghi;<xml/>;
你的规则是:
我需要组合线条,如果线条不以a结尾 分号(;),将下一行合并到当前行。
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/>;
答案 1 :(得分:0)
sed将是我的选择。
sed ':a;/[^;]$/{N;s/\n//;ta}' x.txt
sed读取每一行和每一行 设置标签(:a) 然后检查线条是否缺失; (/ [^] $ /) 如果它没有; N读取下一行并将其附加到当前行,并用新行分隔它们。 s / \ n //删除换行符 ta检查替换是否成功,如果是,则跳转到:a标签再次开始检查