下午好
我正在尝试制作一个清除一些数据输出文件的 bash 脚本。文件如下所示:
/path/
/path/to
/path/to/keep
/another/
/another/path/
/another/path/to
/another/path/to/keep
我想结束这个:
/path/to/keep
/another/path/to/keep
我想循环遍历文件的行,检查下一行是否包含当前行,如果包含,则从文件中删除当前行。这是我的代码:
for LINE in $(cat bbutters_data2.txt)
do
grep -A1 ${LINE} bbutters_data2.txt
if [ $? -eq 0 ]
then
sed -i '/${LINE}/d' ./bbutters_data2.txt
fi
done
最佳答案
假设您的输入文件按照您显示的方式排序:
$ awk 'NR>1 && substr($0,1,length(last))!=last {print last;} {last=$0;} END{print last}' file
/path/to/keep
/another/path/to/keep
工作原理
awk 逐行读取输入文件。每次我们读到一个新行时,我们都会将它与上一个进行比较。如果新行不包含最后一行,那么我们打印最后一行。更详细:
NR>1 && substr($0,1,length(last))!=last {print last;}
如果这不是第一行,并且如果称为
last
的最后一行不包含在当前行$0
中,则打印最后一行。last=$0
更新变量
last
到当前行。END{print last}
我们读完文件后,打印最后一行。
关于用于删除多余行的 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30129511/