-4

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

原始帖子的链接是: 如果最后一个字符是使用批处理文件的分号,则将行与下一行合并

4

2 回答 2

0

下次如果你想做文本处理,不要去windows。: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/>;
于 2013-01-17T17:02:31.883 回答
0

sed 将是我的选择。

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

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

于 2013-01-17T17:06:53.493 回答