Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在unix中删除文件中的一行并修改下一行?_Unix_Sed_Cut - Fatal编程技术网

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

如何在unix中删除文件中的一行并修改下一行?,unix,sed,cut,Unix,Sed,Cut,我有一个文本文件,创建时出错。要解决这个问题,我需要删除一行具有特定唯一字符串的行,并删除下一行@符号前面的字符。我可以用sed和cut来实现这一点,但它只输出一行,而不是我文件中的其他1000行。下面是需要修复的文件部分的示例。我知道发生此错误的行(删除45603341并修改45603342) @HWI-1KL135:70:C305EACXX:5:2105:6727:102841 1:N:0:CAGATC CCAAGTGTCACCTCTTTTATTTATTGATTT@HWI-1KL135:70

我有一个文本文件,创建时出错。要解决这个问题,我需要删除一行具有特定唯一字符串的行,并删除下一行@符号前面的字符。我可以用sed和cut来实现这一点,但它只输出一行,而不是我文件中的其他1000行。下面是需要修复的文件部分的示例。我知道发生此错误的行(删除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

谢谢

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

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
那么:

sed -i -e '45603341d;45603342s/^.*\(@.*\)$/\1/' <filename>
sed-i-e'45603341d;45603342s/^.*\(@.*\)$/\1/'
用文件名替换

这可能适用于您(GNU-sed):


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

另一种“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

你介意看看sed把两条线连接成一条线的能力吗在这里会有帮助。去掉换行符,然后切掉你不想要的部分,直到“@”字符。你能显示你正在使用的sed/cut代码吗?或者
sed-i'45603341N;s/*@/'文件名
这里的第一个建议刚刚删除了两个有问题的行。第二个建议奏效了!!!谢谢!!
100@q