【问题标题】:Convert merge line batch script to shell [closed]将合并行批处理脚本转换为 shell [关闭]
【发布时间】:2013-01-17 16:50:15
【问题描述】:

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

【问题讨论】:

  • 是的,有可能。你试过什么?
  • 没有“Unix 脚本”之类的东西。有脚本语言、shell、管道实用程序和多种编程语言。做一些研究并编写一些代码,那么您将能够更好地提出好的 Stack Overflow 问题。

标签: linux bash shell unix


【解决方案1】:

下次如果你想做文本处理,不要去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/>;

【讨论】:

  • 谢谢@Kent。我收到关于数据大小的错误,因为我的 CSV 文件的每一行都非常大。我发现我可能需要使用 perl。是否可以在 perl 中使用相同的正则表达式?
【解决方案2】:

sed 是我的选择。

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

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

【讨论】:

  • 谢谢@peteches。我收到关于数据大小的错误,因为我的 CSV 文件的每一行都非常大。我发现我可能需要使用 perl。是否可以在 perl 中使用相同的正则表达式?
猜你喜欢
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多