使用sed或awk(或类似)递增或使用循环根据另一个文本文件中给出的行和位置编号在数据文件中执行删除操作

时间:2017-09-22 01:43:31

标签: unix awk sed replace

我希望根据单独文本文件中的列表,在特定行中的特定位置对数据文件进行删除,并且一直在努力解决这个问题。

我在cygwin工作,并且有一个(通常很大的)数据文件(data_file)来进行删除,以及制表符分隔的文本文件(coords_file)列出第2列中的相关行号和匹配位置第3列中每一行的数字。

实际上,我认为我正在尝试执行类似于以下不完整sed命令的操作,其中coords_file $ 2表示从coords_file的第2列获取的行号,coords_file $ 3表示要从中删除的行中的位置。

sed -r 's coords_file$2/(.{coords_file$3}).*/\1/' datafile    

我想知道是否有一种方法可以包含一个循环或迭代,以便sed首先使用coords_file的第一行中的值来填充相关的行和位置坐标,然后再使用来自coords_file中所有行的第二行等?或者,如果有另一种方法,例如使用awk实现相同的结果?

e.g。对于awk,我使用Ed Morton对此问题的回答中非常方便的awk命令,基于字符串匹配识别出这些坐标:line and string position of grep match

awk 'NR==FNR{strings[$0]; next} {for (string in strings) if ( (idx = index($0,string)) > 0 ) print string, FNR, idx }' strings.txt data_file > coords_file.txt

正在考虑可能类似的东西可以进行就地删除,而不仅仅是找到行,例如合并一个简单的查找和替换,如{if($0=="somehow_reference_coords_file_values_here"){$0=""}。但它有点超出我的意义(我是一个编码新手,所以我几乎不了解原始命令是如何工作的,更不用说如何修改它了。)

文件示例

DATA_FILE

@vandelay.1
blablablablablablablablablablablabla
+
mehmehmehmehmehmehmehmehmehmehmehmeh
@vandelay.2
blablablablablablablablablablablabla
+
mehmehmehmehmehmehmehmehmehmehmehmeh
@vandelay.3
blablablablablablablablablablablabla
+
mehmehmehmehmehmehmehmehmehmehmehmeh

coords_file(制表符分隔)
(第1列只是匹配的字符串,第2列是它匹配的行号,第3列是匹配的位置号)。

stringID 2 20
stringID 4 20
stringID 10 27
stringID 12 27

期望的结果:

@vandelay.1
blablablablablablab
+
mehmehmehmehmehmehm
@vandelay.2
blablablablablablablablablablablabla
+
mehmehmehmehmehmehmehmehmehmehmehmeh
@vandelay.3
blablablablablablablablabl
+
mehmehmehmehmehmehmehmehme

非常感谢任何指导! (正如我所提到的,我对这个编码场景非常新的,所以如果其中一些没有意义或者我的问题格式不合适(或者如果问题本身是初级的)那么道歉)。

干杯。

(顺便说一句,这一切都是为了删除在data_file blablabla行中识别的字符串以及下面2行的相同位置(即{{1因为mehmehmeh个字符的质量得分与每个样本的mehmehmeh字符匹配(每个blablabla)。因此,基本上这个:@vandelay.xx,但也在运行每次识别字符串时,下面有两行相同的删除。所以如果实际上有一个更简单的脚本来代替上面问题中的所有内容,请告诉我!)

1 个答案:

答案 0 :(得分:2)

您只需使用一个班轮awk即可,

$ 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中创建行号和匹配的位置图。由于coords_file
  • ,此部分表达式只会处理NR==FNR
  • (FNR in a):然后awk将开始处理data_file。使用表达式搜索数组a中包含的任何FNR。
  • $0=substr($0,0,a[FNR]-1):将$0重新分配到要删除的行。
  • 1:打印所有行