Unix 根据另一个文本文件中给出的行数和位置号,增量使用sed或awk(或类似)或使用循环在数据文件中进行删除
我希望根据一个单独的文本文件中的列表,在特定行中的特定位置删除数据文件,我一直在努力解决这个问题 我在cygwin工作,有一个(通常较大的)数据文件(data_文件)来进行删除,还有一个以制表符分隔的文本文件(coords_文件),列出第2列中的相关行号和第3列中每一行的匹配位置号 实际上,我想我正在尝试执行类似于以下不完整的sed命令的操作,其中coords_文件$2表示从coords_文件第2列中获取的行号,coords_文件$3表示要从中删除的行中的位置Unix 根据另一个文本文件中给出的行数和位置号,增量使用sed或awk(或类似)或使用循环在数据文件中进行删除,unix,awk,sed,replace,Unix,Awk,Sed,Replace,我希望根据一个单独的文本文件中的列表,在特定行中的特定位置删除数据文件,我一直在努力解决这个问题 我在cygwin工作,有一个(通常较大的)数据文件(data_文件)来进行删除,还有一个以制表符分隔的文本文件(coords_文件),列出第2列中的相关行号和第3列中每一行的匹配位置号 实际上,我想我正在尝试执行类似于以下不完整的sed命令的操作,其中coords_文件$2表示从coords_文件第2列中获取的行号,coords_文件$3表示要从中删除的行中的位置 sed -r 's coords_
sed -r 's coords_file$2/(.{coords_file$3}).*/\1/' datafile
我想知道是否有一种方法可以包含一个循环或迭代,以便sed首先使用coords_文件第一行中的值来填充相关的行和位置坐标,然后使用第二行中的值再次运行,等等。对于coords_文件中的所有行?或者如果有其他方法,例如使用awk来实现相同的结果
e、 g.对于awk,我使用Ed Morton对这个问题的回答中的这个非常方便的awk命令,根据字符串匹配确定了这些坐标:
我在想,可能类似的东西可以在原地删除,而不仅仅是查找行,比如合并一个简单的查找和替换,比如{if($0==“莫名其妙地引用\u coords\u文件\u这里的值”){$0=“”}
。但这有点超出我的理解(我是一名编码新手,所以我几乎不了解原始命令是如何工作的,更不用说如何修改它了)
文件示例
数据文件
@vandelay.1
blablablablablablablablablablablabla
+
mehmehmehmehmehmehmehmehmehmehmehmeh
@vandelay.2
blablablablablablablablablablablabla
+
mehmehmehmehmehmehmehmehmehmehmehmeh
@vandelay.3
blablablablablablablablablablablabla
+
mehmehmehmehmehmehmehmehmehmehmehmeh
coords_文件(制表符分隔)(第1列只是匹配的字符串,第2列是匹配的行号,第3列是匹配的位置号) 预期结果:
@vandelay.1
blablablablablablab
+
mehmehmehmehmehmehm
@vandelay.2
blablablablablablablablablablablabla
+
mehmehmehmehmehmehmehmehmehmehmehmeh
@vandelay.3
blablablablablablablablabl
+
mehmehmehmehmehmehmehmehme
任何指导都将不胜感激,谢谢!(正如我所提到的,我对这个编码场景非常陌生,因此,如果其中一些没有意义,或者我的问题格式很肤浅(或者如果问题本身是初步的),我深表歉意)
干杯
(顺便说一句,删除数据文件
blablabla
行中标识的字符串以及下面2行的相同位置(即mehmehmeh
行)都是一项艰巨的工作,因为mehmehmeh
字符是与每个样本的blablabla
字符匹配的质量分数(每个@vandelay.xx
)。也就是说,本质上是:sed-i的/string.*/'数据文件
,但每次识别字符串时都会在下面运行相同的删除操作2行。因此,如果实际上有一个更简单的脚本来执行此操作,而不是上面问题中的所有内容,请让我知道!)您只需使用一个linerawk
即可
$ awk 'NR==FNR{a[$2]=$3;next} (FNR in a){$0=substr($0,0,a[FNR]-1)}1' coords_file data_file
@vandelay.1
blablablablablablab
+
mehmehmehmehmehmehm
@vandelay.2
blablablablablablablablablablablabla
+
mehmehmehmehmehmehmehmehmehmehmehmeh
@vandelay.3
blablablablablablablablabl
+
mehmehmehmehmehmehmehmehme
简要说明
:在数组NR==FNR{a[$2]=3;next}
中创建行号和匹配的位置映射。由于a
NR==FNR
:然后(a中的FNR)
将开始处理awk
。使用表达式搜索数组a中包含的任何FNR数据文件
:将$0=substr($0,0,a[FNR]-1)
重新分配给要剪切的行$0
:打印所有行1
@vandelay.1
blablablablablablab
+
mehmehmehmehmehmehm
@vandelay.2
blablablablablablablablablablablabla
+
mehmehmehmehmehmehmehmehmehmehmehmeh
@vandelay.3
blablablablablablablablabl
+
mehmehmehmehmehmehmehmehme
$ awk 'NR==FNR{a[$2]=$3;next} (FNR in a){$0=substr($0,0,a[FNR]-1)}1' coords_file data_file
@vandelay.1
blablablablablablab
+
mehmehmehmehmehmehm
@vandelay.2
blablablablablablablablablablablabla
+
mehmehmehmehmehmehmehmehmehmehmehmeh
@vandelay.3
blablablablablablablablabl
+
mehmehmehmehmehmehmehmehme