Linux 将合并行批处理脚本转换为shell
我最近在同一个论坛上问了一个问题,并找到了解决办法。不幸的是,它必须转换为UNIX。问题是合并csv文件中的行。每行应以分号结尾;如果它在再次找到分号之前没有将下一行合并到它中 对我有效的解决方案是Linux 将合并行批处理脚本转换为shell,linux,bash,shell,unix,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 enableDelayedExpan
@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脚本
指向原始帖子的链接是:下次如果要进行文本处理,请不要转到windows:D 鉴于你有:
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/>;
sed将是我的选择
sed ':a;/[^;]$/{N;s/\n//;ta}' x.txt
sed读取每一行和每一行的内容
设置标记:a
然后检查线路是否丢失了数据/[^;]$/
如果它没有;N读入下一行并将其附加到当前行,并用新行分隔它们。
s/\n//删除换行符
ta检查替换是否成功,如果成功,则跳转到:a标记以再次开始检查是的,这是可能的。你试过什么?没有Unix脚本这样的东西。有脚本语言、shell、管道实用程序和多种编程语言。做一些研究并编写一些代码,这样你就能更好地提出好的堆栈溢出问题。谢谢@Kent。由于我的CSV文件的每一行都相当大,因此我得到了一个关于数据大小的错误。我发现我可能需要使用perl。可以在perl中使用相同的正则表达式吗?谢谢@peteches。由于我的CSV文件的每一行都相当大,因此我得到了一个关于数据大小的错误。我发现我可能需要使用perl。可以将同一个正则表达式与perl一起使用吗?
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/>;
sed ':a;/[^;]$/{N;s/\n//;ta}' x.txt