我希望根据单独文本文件中的列表,在特定行中的特定位置对数据文件进行删除,并且一直在努力解决这个问题。
我在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
,但也在运行每次识别字符串时,下面有两行相同的删除。所以如果实际上有一个更简单的脚本来代替上面问题中的所有内容,请告诉我!)
答案 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
:打印所有行