我有一个包含两种类型字段分隔符的记录(行)的文件,|
如下!
所示:
Name|Age|Physics|Chemistry|Maths|English|Batch!Year!AdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS!2021!1001!A!75
Student2|72|63|60|50|75|EWS!2021!1002!A!85
Student3|72|63|60|50|75|EWS!2021!1002!A!85
如何合并Batch
,Year
和AdmisnNo
字段如下?
请注意,为简洁起见,我展示了一个有用字段的小列表,因为我的真实文件有许多这样的相关字段。我要删除两个或三个!
标记的这个字段不是最后一个,可以是大约 49 个字段总数中的任何字段(6 或 7)。
Name|Age|Physics|Chemistry|Maths|English|BatchYearAdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS20211001!A!75
Student2|72|63|60|50|75|EWS20211002!A!85
Student3|72|63|60|50|75|EWS20211002!A!85
我要求awk
,但是欢迎任何合理的标准命令。
这用于从输入的最后一个分隔字段中
awk
删除前两个字符。!
|
NF
在代码中使用任意数字代替awk
最后一个字段来影响其他字段。假设只有最后一个字段包含
!
字符,使用sed
:这将删除
!
每行的第一个。然后它第二次执行完全相同的替换,!
也删除了第二次。反转每一行并连续两次删除第三
!
行,然后再次反转结果行。这允许其他|
以 - 分隔的字段也包含!
字符。此任务适用于在
sed
不拆分字段的情况下将第 7 个字段与下一个字段合并:再次运行会将第 7 个(最初是第 8 个)与下一个合并。完全:
或者更短的时间(由 Philippos 建议),因为如果第一次替换将发生第二次替换:
也
-E
用于可移植性,意思是扩展正则表达式。输出:
请注意,第一次替换后,第 8 个字段变为第 7 个,因此我们
7
再次使用它。就像做一样sed '' file | sed ''
。此外,您在这里拥有的不同字段分隔符也很方便,并且可以调整以合并几乎任何相邻的字段。
使用 GNU awk 作为第四个参数
split()
:为上述示例工作并获得所需的输出
输出
这只是一种可能的 perl 解决方案
用一系列
join
s 编写,所以如果你的用例变得更复杂,比如说你想删除数学,你只需删除那个索引 (4)它似乎比连接字段并在重新组合之前将额外的字段从数组中拼接出来更整洁。