如何删除文件中的一个特定行并修改unix中的下一行?

时间:2014-05-28 19:53:28

标签: unix sed cut

我有一个文本文件,创建时出错。要解决此问题,我需要删除具有特定唯一字符串的行,并删除@符号前面的以下行中的字符。我能用sed和cut做到这一点,但它只输出一行,而不是我文件中的许多其他1000行。以下是需要修复的文件部分的示例。我知道发生此错误的行#s(删除45603341并修改45603342)。

@HWI-1KL135:70:C305EACXX:5:2105:6727:102841 1:N:0:CAGATC
CCAAGTGTCACCTCTTTTATTTATTGATTT@HWI-1KL135:70:C305EACXX:5:1101:1178:2203 1:N:0:CAGATC

我需要输出看起来像这样,并保持文件的其余部分保持不变。

@HWI-1KL135:70:C305EACXX:5:1101:1178:2203 1:N:0:CAGATC

谢谢!

4 个答案:

答案 0 :(得分:1)

怎么样:

sed -i -e '45603341d;45603342s/^.*\(@.*\)$/\1/' <filename>

<filename>替换为您的文件名称。

答案 1 :(得分:0)

如果您想更改特定行并删除上面的行,请运行,

sed -ri '45603342s/^([^@]*)(@.*)$/\2/g; 45603341d' aa 

示例:

$ cat aa
@HWI-1KL135:70:C305EACXX:5:2105:6727:102841 1:N:0:CAGATC
CCAAGTGTCACCTCTTTTATTTATTGATTT@HWI-1KL135:70:C305EACXX:5:1101:1178:2203 1:N:0:CAGATC

$ sed -r '2s/^([^@]*)(@.*)$/\2/g; 1d' aa 
@HWI-1KL135:70:C305EACXX:5:1101:1178:2203 1:N:0:CAGATC

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed '45603341!b;N;s/^.*\n[^@]*//' file

保持与任何其他行ecsept 45603341一样。在这一行上,添加以下行,然后删除所有内容从开头到附加行中的第一个非@

答案 3 :(得分:0)

“sed”的另一种方法是使用vim宏(这也适用于Windows)。主要的缺点是你将无法像'sed'那样整合内部脚本。主要优点是它允许复杂的替换,如“搜索此模式,然后清除线,向下移动3行,移动到第40列,切换线,......)。如果您已经熟悉VIM,它也很多更直观。

在这种特殊情况下,您必须执行类似

的操作
qq (start macro recording)
/^@HWI.*CAGATC$ (search pattern)
dd (delete line)
vw (select word)
d (delete selected word)
q (end macro)

要运行宏100次:

100@q