将合并行批处理脚本转换为shell

时间:2013-01-17 16:50:16

标签: linux bash shell unix

我最近在同一个论坛上提出了一个问题并找到了解决方案。不幸的是,它必须转换为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

2 个答案:

答案 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标签再次开始检查