Unix 根据另一个文本文件中给出的行数和位置号,增量使用sed或awk(或类似)或使用循环在数据文件中进行删除

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_

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

我在cygwin工作,有一个(通常较大的)数据文件(data_文件)来进行删除,还有一个以制表符分隔的文本文件(coords_文件),列出第2列中的相关行号和第3列中每一行的匹配位置号

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

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行。因此,如果实际上有一个更简单的脚本来执行此操作,而不是上面问题中的所有内容,请让我知道!)

您只需使用一个liner
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
    中创建行号和匹配的位置映射。由于
    NR==FNR
  • (a中的FNR)
    :然后
    awk
    将开始处理
    数据文件
    。使用表达式搜索数组a中包含的任何FNR
  • $0=substr($0,0,a[FNR]-1)
    :将
    $0
    重新分配给要剪切的行
  • 1
    :打印所有行

下面的答案看起来像是针对您描述的问题的解决方案,……但如果这不仅仅是一次性解决方案,我真的希望您能够回溯并修复您的生产流程。如果您将此问题留在原地(根据个人经验/观察;-/),情况只会变得更糟.祝你好运。谢谢@SHEET的回复。是的,CWLiu的回复非常完美。我希望这确实是一次性的!但如果是正在进行的事情,我会想办法回溯并尽早修复;).Cheers.Legend.这太好了,谢谢。我没有代表投票对不起,但这是正确的。另外,谢谢你的详细解释。顺便说一句,我没有编码背景,所以这种解释肯定会帮助我开始了解命令中的实际情况。干杯。
@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