jac*_*row 3 sed awk text-processing
我有这样的输入:
FIELD1 FIELD2 FIELD3 FIELD4
aaaa bbbb cccc dddd
eeee ffff
gggg hhhh
iiii jjjj kk llll
kk
Run Code Online (Sandbox Code Playgroud)
它应该是一个以空格分隔的记录列表,但有些写错了。
正确的行就像第一行。其他行在中间(第二行)有一个换行符,或者一个字段被写入,因为它在一个字段(第三行的第三个字段)中有一个换行符。
我想要做的是获得这样的有序输出:
FIELD1 FIELD2 FIELD3 FIELD4
aaaa aaaa aaaa aaaa
bbbb bbbb bbbb bbbb
cccc cccc cccc cccc
Run Code Online (Sandbox Code Playgroud)
我想如果我可以修复像 ROW2 这样的一行,修复 ROW3 将是类似的,但我无法理解如何使用某种工具,awk
或者一次sed
看到不止一行,例如,替换 "\n\s* bbbb”与“bbbb”并修复 ROW2。
编辑:
这是我拥有的真实数据的片段:
G00PFMA1 transition_readonly 2 cifs 0.0.0.0/0 any
G00PFMA7 transition_export_policy_1 1
nfs 10.58.91.134 sys
G00PFMA7 transition_export_policy_1 2
nfs bmczone.tsy.fm. sys
hypovereinsbank.de
G00PFMA7 transition_export_policy_1 3
nfs inf01mz2 sys
Run Code Online (Sandbox Code Playgroud)
字段由空格分隔。ROW1 是每行应该如何,但 ROW2 和 ROW4 在 FIELD3 和 FIELD4 之间有一个换行符,而 ROW3 似乎在 FIELD5 中有一个换行符。这可能是因为这是从 Excel 文件复制和粘贴的结果,您可以在其中的字段中添加换行符。
编辑2:
使用这段文本,正确的输出将是:
G00PFMA1 transition_readonly 2 cifs 0.0.0.0/0 any
G00PFMA7 transition_export_policy_1 1 nfs 10.58.91.134 sys
G00PFMA7 transition_export_policy_1 2 nfs bmczone.tsy.fm.hypovereinsbank.de sys
G00PFMA7 transition_export_policy_1 3 nfs inf01mz2 sys
Run Code Online (Sandbox Code Playgroud)
让我们首先修复分割线,忽略分割列:
$ grep -v "^\s*[^ ]*$" file | grep -o "[^ ]*" | paste - - - - - -
G00PFMA1 transition_readonly 2 cifs 0.0.0.0/0 any
G00PFMA7 transition_export_policy_1 1 nfs 10.58.91.134 sys
G00PFMA7 transition_export_policy_1 2 nfs bmczone.tsy.fm. sys
G00PFMA7 transition_export_policy_1 3 nfs inf01mz2 sys
Run Code Online (Sandbox Code Playgroud)
解释:
过滤仅包含单个元素的行:
grep -v "^\s*[^ ]*$" file
Run Code Online (Sandbox Code Playgroud)将所有项目放在单独的行上
grep -o "[^ ]*"
Run Code Online (Sandbox Code Playgroud)将它们重新组合到每行六列
paste - - - - - -
Run Code Online (Sandbox Code Playgroud)我得到了一个 hacky 完整解决方案,它可能足以满足您的需求,但既不美观也不便携。它假设唯一要拆分的列是第 5 列,并且我们将始终有 6 列。
$ grep -v "^\s*[^ ]*$" file | grep -o "[^ ]*" | paste - - - - - -
G00PFMA1 transition_readonly 2 cifs 0.0.0.0/0 any
G00PFMA7 transition_export_policy_1 1 nfs 10.58.91.134 sys
G00PFMA7 transition_export_policy_1 2 nfs bmczone.tsy.fm. sys
G00PFMA7 transition_export_policy_1 3 nfs inf01mz2 sys
Run Code Online (Sandbox Code Playgroud)
输出:
G00PFMA1 transition_readonly 2 cifs 0.0.0.0/0 any
G00PFMA7 transition_export_policy_1 1 nfs 10.58.91.134 sys
G00PFMA7 transition_export_policy_1 2 nfs bmczone.tsy.fm.hypovereinsbank.de sys
G00PFMA7 transition_export_policy_1 3 nfs inf01mz2 sys
Run Code Online (Sandbox Code Playgroud)