linux – 使用SED删除某些行,并使用要删除的行号的索引
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 使用SED删除某些行,并使用要删除的行号的索引,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1366字,纯文字阅读大概需要2分钟。
内容图文
![linux – 使用SED删除某些行,并使用要删除的行号的索引](/upload/InfoBanner/zyjiaocheng/950/f01eb66d195f449f8909c001bed2ad47.jpg)
我得到一个大文件,称之为file.txt,可能有20000行或更多.其中一些行必须从原始文件中删除,并且必须创建包含其余行的新文件,如newfile.txt.要删除的行位于另一个文件中,如index.txt.所以我是这样的:
file.txt的:
line1
line2
...
line19999
line20000
index.txt
11
56
79
...
19856
我一直在尝试使用sed,试图让它使用索引中的数字来删除这些行,例如:
for i in ${index.txt[@]}
do
sed -i.back '${i}d' file.txt>newfile.txt
done
但是,我收到错误说${index.txt [@]}:错误的替换,我不知道如何解决这个问题.
我也试过使用gawk,但代码有问题,我认为这与文件缩进带标签的事实有关.如果有人可以提供帮助,我会非常感激.
解决方法:
不要在循环中调用sed,这将非常慢.
您可以将索引文件转换为sed脚本,然后在数据文件上调用sed一次:
sed -i.bak "$(sed 's/$/d/' index.txt)" file.txt
或者,正如@ Hazzard17指出的那样,忽略不包含数字的行:
script=$(sed -n '/^[[:blank:]]*[[:digit:]]\+[[:blank:]]*$/ s/$/d/p' index.txt)
sed -i.bak "$script" file.txt
一个演示:
$seq 20000 | sed 's/^/line/' > file.txt
$wc file.txt
20000 20000 188894 file.txt
$seq 20000 | while read n; do [[ $RANDOM -le 5000 ]] && echo $n; done > index.txt
$wc index.txt
3083 3083 16789 index.txt
$sed -i.bak "$(sed 's/$/d/' index.txt)" file.txt
$wc -l file.txt{,.bak}
16917 file.txt
20000 file.txt.bak
36917 total
要将文件读入数组,您可以执行以下操作:
mapfile -t indices < index.txt
for i in "${indices[@]}"; do ...; done
或者只是遍历文件
while IFS= read -r i; do ...; done < index.txt
内容总结
以上是互联网集市为您收集整理的linux – 使用SED删除某些行,并使用要删除的行号的索引全部内容,希望文章能够帮你解决linux – 使用SED删除某些行,并使用要删除的行号的索引所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。