删除列表中类似文件中的行
Remove line in a file in similar found in a list
我有一个包含路径(几千行)的文件“selected_files.log”,我有一个排除文件“exclusion.txt”,其中包含我不想在我的文件中看到的路径和扩展名selected_files.log
我一直在尝试使用 grep 和 sed,但没有成功
这是我最后一次搜索。有人帮忙吗?谢谢
lines=$(cat exclusion.txt)
for x in "$lines";
do
grep -v "$x" "selected_files.log" > new_file.log
echo "x is $x"
#sed `/$x/d` -i "selected_files.log"
done
Comm -23 不起作用,因为文件未排序。
我试过 "/"$x"/d" -i 但没有运气:未终止的地址正则表达式
我的文件包含的示例
selected_files.log
/mnt/user/system/data/S97/001584.bkp
/mnt/user/system/data/S97/00284.bkp
/mnt/user/system/data/S97/0058244.bkp
/mnt/user/system/data/A12/external.log
/mnt/user/system/data/A12/internal.log
/mnt/user/system/input/system_run.sh
/mnt/user/system/input/user.sh
/mnt/user/system/output/results.dt
/mnt/user/david/test/test.sh
/mnt/user/david/prod/bdd.bkp
/mnt/user/system/old_bkp.tmp
/mnt/user/system/output/test space/test.tmp
exclusion.txt
external.log
/mnt/user/system/input/
david
.tmp
想要的结果:
/mnt/user/system/data/S97/001584.bkp
/mnt/user/system/data/S97/00284.bkp
/mnt/user/system/data/S97/0058244.bkp
/mnt/user/system/data/A12/internal.log
/mnt/user/system/output/results.dt
grep -Fvxf exclusion.txt selected_files.log >> tmp && cat tmp > selected_files.log
awk 'NR==FNR{a[[=11=]];next} !([=11=] in a)' exclusion.txt selected_files.log >> tmp && cat tmp > selected_files.log
gawk -i inplace 'NR==FNR{a[[=12=]];next} !([=12=] in a)' exclusion.txt selected_files.log
注意:它会就地编辑 selected_files.log 但也会擦除 exclusion.txt
似乎是 for 循环引起了问题。
尝试
cat exclusion.txt | while read f; do sed "/^${f//\//\\/}$/d" selected* -i; done
更新循环工作
猫selected_files.log
/mnt/user/system/data/S97/001584.bkp
/mnt/user/system/data/S97/00284.bkp
/mnt/user/system/data/S97/0058244.bkp
/mnt/user/system/data/A12/external.log
/mnt/user/system/data/A12/internal.log
/mnt/user/system/input/system_run.sh
/mnt/user/system/input/user.sh
/mnt/user/system/output/results.dt
/mnt/user/david/test/test.sh
/mnt/user/david/prod/bdd.bkp
/mnt/user/system/old_bkp.tmp
猫exclusion.txt
external.log
/mnt/user/system/input/
david
.tmp
IFS=$'\n' && for f in `cat exclusion.txt`; do sed "/^"${f//\//\\/}"$/d" selected_files.log -i; done
或
lines="$(cat exclusion.txt)"
for x in `echo "$lines"`;
do grep -v "$x" "selected_files.log" > new_file.log;
echo "x is $x";
sed "/^"$(echo "${x//\//\\/}")"$/d" selected_files.log -i;
done
猫selected_files.log
/mnt/user/system/data/S97/001584.bkp
/mnt/user/system/data/S97/00284.bkp
/mnt/user/system/data/S97/0058244.bkp
/mnt/user/system/data/A12/internal.log
/mnt/user/system/output/results.dt
Select 如果能解决你的问题就回答
感谢 Haru,我的解决方案是综合了所有方法。
lines="$(cat "exclusion.txt")"
IFS=$'\n'
for x in `echo "$lines"`;
do echo "x is $x";
grep -v "$x" "selected_files.log" > new_file.log;
sed "/"$(echo "${x//\//\\/}")"/d" "selected_files.log" -i;
done
unset IFS
我有一个包含路径(几千行)的文件“selected_files.log”,我有一个排除文件“exclusion.txt”,其中包含我不想在我的文件中看到的路径和扩展名selected_files.log
我一直在尝试使用 grep 和 sed,但没有成功 这是我最后一次搜索。有人帮忙吗?谢谢
lines=$(cat exclusion.txt)
for x in "$lines";
do
grep -v "$x" "selected_files.log" > new_file.log
echo "x is $x"
#sed `/$x/d` -i "selected_files.log"
done
Comm -23 不起作用,因为文件未排序。 我试过 "/"$x"/d" -i 但没有运气:未终止的地址正则表达式
我的文件包含的示例 selected_files.log
/mnt/user/system/data/S97/001584.bkp
/mnt/user/system/data/S97/00284.bkp
/mnt/user/system/data/S97/0058244.bkp
/mnt/user/system/data/A12/external.log
/mnt/user/system/data/A12/internal.log
/mnt/user/system/input/system_run.sh
/mnt/user/system/input/user.sh
/mnt/user/system/output/results.dt
/mnt/user/david/test/test.sh
/mnt/user/david/prod/bdd.bkp
/mnt/user/system/old_bkp.tmp
/mnt/user/system/output/test space/test.tmp
exclusion.txt
external.log
/mnt/user/system/input/
david
.tmp
想要的结果:
/mnt/user/system/data/S97/001584.bkp
/mnt/user/system/data/S97/00284.bkp
/mnt/user/system/data/S97/0058244.bkp
/mnt/user/system/data/A12/internal.log
/mnt/user/system/output/results.dt
grep -Fvxf exclusion.txt selected_files.log >> tmp && cat tmp > selected_files.log
awk 'NR==FNR{a[[=11=]];next} !([=11=] in a)' exclusion.txt selected_files.log >> tmp && cat tmp > selected_files.log
gawk -i inplace 'NR==FNR{a[[=12=]];next} !([=12=] in a)' exclusion.txt selected_files.log
注意:它会就地编辑 selected_files.log 但也会擦除 exclusion.txt
似乎是 for 循环引起了问题。 尝试
cat exclusion.txt | while read f; do sed "/^${f//\//\\/}$/d" selected* -i; done
更新循环工作
猫selected_files.log
/mnt/user/system/data/S97/001584.bkp
/mnt/user/system/data/S97/00284.bkp
/mnt/user/system/data/S97/0058244.bkp
/mnt/user/system/data/A12/external.log
/mnt/user/system/data/A12/internal.log
/mnt/user/system/input/system_run.sh
/mnt/user/system/input/user.sh
/mnt/user/system/output/results.dt
/mnt/user/david/test/test.sh
/mnt/user/david/prod/bdd.bkp
/mnt/user/system/old_bkp.tmp
猫exclusion.txt
external.log
/mnt/user/system/input/
david
.tmp
IFS=$'\n' && for f in `cat exclusion.txt`; do sed "/^"${f//\//\\/}"$/d" selected_files.log -i; done
或
lines="$(cat exclusion.txt)"
for x in `echo "$lines"`;
do grep -v "$x" "selected_files.log" > new_file.log;
echo "x is $x";
sed "/^"$(echo "${x//\//\\/}")"$/d" selected_files.log -i;
done
猫selected_files.log
/mnt/user/system/data/S97/001584.bkp
/mnt/user/system/data/S97/00284.bkp
/mnt/user/system/data/S97/0058244.bkp
/mnt/user/system/data/A12/internal.log
/mnt/user/system/output/results.dt
Select 如果能解决你的问题就回答
感谢 Haru,我的解决方案是综合了所有方法。
lines="$(cat "exclusion.txt")"
IFS=$'\n'
for x in `echo "$lines"`;
do echo "x is $x";
grep -v "$x" "selected_files.log" > new_file.log;
sed "/"$(echo "${x//\//\\/}")"/d" "selected_files.log" -i;
done
unset IFS