Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 删除文件中的行,直到指定行_Bash_Shell - Fatal编程技术网

Bash 删除文件中的行,直到指定行

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

我想用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 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教程。