Bash 删除文件中的行,直到指定行
我想用shell脚本和循环概念来解决这个问题 我有一个文本文件(Bash 删除文件中的行,直到指定行,bash,shell,Bash,Shell,我想用shell脚本和循环概念来解决这个问题 我有一个文本文件(file.txt)包含如下数据: ABC 123 hahah 1897237 ABC 123 hahah 1897237 ABC 123 hahah 156756737 FDC 123 hasddhs 0 FDC 123 hasddhs 0 ABC 123 hahah 18567737 ABC 123 hahah 1897237 ABC 123 hahah 167767 ABC 123 hahah 1897237 FDC 123 h
file.txt
)包含如下数据:
ABC 123 hahah 1897237
ABC 123 hahah 1897237
ABC 123 hahah 156756737
FDC 123 hasddhs 0
FDC 123 hasddhs 0
ABC 123 hahah 18567737
ABC 123 hahah 1897237
ABC 123 hahah 167767
ABC 123 hahah 1897237
FDC 123 hasddhs 0
GXT 123 asdfg 0
我想删除从最后一行到以相同名称开始的行的行,即ABC
预期产出为:
ABC 123 hahah 1897237
ABC 123 hahah 1897237
ABC 123 hahah 156756737
FDC 123 hasddhs 0
FDC 123 hasddhs 0
ABC 123 hahah 18567737
ABC 123 hahah 1897237
ABC 123 hahah 167767
ABC 123 hahah 1897237
我不在乎,即使用零结尾的行在中间,也不应该在最后。另外,如果以统一名称开头的行以0
结尾,我想抛出一个错误
示例:
ABC 123 hahah 0
我会给你一个大致的想法,但这不是一个完整的解决方案,因为我觉得这里没有足够的信息
#!/bin/sh -x
sed -n '/ABC/p' file >> file1
这只是打印包含“ABC”的所有行,并将它们写入一个新文件。如果这就是您想要的,那么您可以使用mv用新文件覆盖原始文件。使用tac
如果您有tac,您可以执行tac | sed | tac
:
kent$ tac file|sed '0,/^ABC/{/^ABC/!d}'|tac
ABC 123 hahah 1897237
ABC 123 hahah 1897237
ABC 123 hahah 156756737
FDC 123 hasddhs 0
FDC 123 hasddhs 0
ABC 123 hahah 18567737
ABC 123 hahah 1897237
ABC 123 hahah 167767
ABC 123 hahah 1897237
awk一班轮
您还可以让awk读取您的文件两次。在第一步中标记最后一行ABC
,然后在第二步中打印所需的行:
kent$ awk 'NR==FNR&&/^ABC/{n=FNR;next}FNR<=n ' file file
ABC 123 hahah 1897237
ABC 123 hahah 1897237
ABC 123 hahah 156756737
FDC 123 hasddhs 0
FDC 123 hasddhs 0
ABC 123 hahah 18567737
ABC 123 hahah 1897237
ABC 123 hahah 167767
ABC 123 hahah 1897237
kent$awk'NR==FNR&/^ABC/{n=FNR;next}fn您尝试了什么?请展示您的最佳编码尝试。任务是删除名称重复的行,但输出显示3行,顶部有ABC。这不是OP想要的。非常感谢您,伙计……它正在工作……如果您不介意,请解释一下逻辑,以便我能理解这一点command@Akcs004你不明白哪一部分?{n=FNR;next}FNR@Akcs004我在回答中指出,我们将要阅读该文件两次。我建议选择一些awk教程。