Bash 删除每N行的最后一个字符

Bash 删除每N行的最后一个字符,bash,text,awk,sed,Bash,Text,Awk,Sed,我有一个有四行重复的文件。我希望删除每四行的最后一个字符。下面是对该文件的描述 @Header DNA Sequence + Quality score! <Pattern of four above lines repeats> 我目前不确定如何将编辑的质量分数覆盖到原始文件中。如有任何想法或更简洁的sed/awk论点,将不胜感激 GNU sed有一个可在每一条第n条线路上运行的扩展: sed '4~4s/.$//' m~n表示在每n行重复一次的m-th行上,运行以下命

我有一个有四行重复的文件。我希望删除每四行的最后一个字符。下面是对该文件的描述

@Header  
DNA Sequence 
+ 
Quality score!
<Pattern of four above lines repeats>

我目前不确定如何将编辑的质量分数覆盖到原始文件中。如有任何想法或更简洁的sed/awk论点,将不胜感激

GNU sed有一个可在每一条第n条线路上运行的扩展:

sed '4~4s/.$//'

m~n
表示在每
n
行重复一次的
m
-th行上,运行以下命令。

请尝试以下命令

awk 'FNR%4==0{print substr($0,1,length($0)-1);next} 1' Input_file > temp_file && mv temp_file Input_file
这将把输出保存到输入文件本身(它将创建一个名为
temp\u file
的输出目录,然后将
temp\u file
重命名/移动到实际的
Input\u文件
)。

给定:

$ cat file
1!
2!
3!
4!
5!
6!
7!
8!
9!
10!
11!
12!
您可以使用awk:

$ awk 'NR%4==0{sub(/!$/,"")}1' file
1!
2!
3!
4
5!
6!
7!
8
9!
10!
11!
12
如果您有
gawk
,您可以就地更改:

$ gawk -i inplace 'NR%4==0{sub(/!$/,"")}1' file
$ cat file
1!
2!
3!
4
5!
6!
7!
8
9!
10!
11!
12
如果您只有POSIX awk,您可以通过使用临时文件有效地获得就地替换:

$ awk 'NR%4==0{sub(/!$/,"")}1' file >tmp_file && mv tmp_file file
(这就是GNU-sed、GNU-awk、perl或ruby在“就地”替换的掩护下所做的…

perl拯救一切

perl -lpe 'chop if 0 == $. % 4'
  • -p
    逐行读取输入并在处理后打印
  • -l
    从输入行中删除换行符并将其添加回输出
  • 删除最后一个字符
  • $。
    是包含输入行号的特殊代码,
    %
    是模
这可能适合您(GNU-sed):



现在也请在您的帖子中发布预期输出。/为什么您只想删除最后一个质量,同时保留最后一个基数???嘿@RavinderSingh13,谢谢editsHi@Poshi,好问题,我的质量分数比我的所有序列都多了一个短语字符(!)。我花了一点时间才弄明白,这很有效!我猜如果我想在不同的线路上运行,我可以改变FNR%后的4。再次感谢@CodyGlickman,yes
FNR%4==0
表示如果行号被
4
整除,则执行此操作。是的,您也可以根据自己的意愿进行更改,并在几分钟内添加完整的解释。谢谢@dawg,sed标志也适用于此。sed正在生成示例输入以演示解决方案,而不是解决您的问题
awk'NR%4==0{sub(/!$/,“”)}1'
是您问题的解决方案。如果您有
gawk
,您可以使用
gawk-i inplace
来执行inplace替换。谢谢@EdMorton,所以除非我有gawk要执行inplace,否则我仍然需要对该文件进行mv。@CodyGlickman评论说,在sed中inplace和awk对您来说只是一个花哨的词“使用临时名称创建一个新文件,然后移动它,覆盖旧文件。~在Mac的sed上是无效的命令代码。”。不过,我很感谢您的输入,这很漂亮,稍后我会在我的linux桌面上尝试。另请参见感谢@jas,一点自制的东西会有很大的帮助@choroba,作为一个经常抱怨perl的人,这非常简洁易读。另外,它也非常有用。@CodyGlickman:Perl可读性强,简洁。不幸的是,许多人不能这样使用它。可读的Perl和Ruby单行答案几乎总是能得到我的答案+1@choroba,这个答案动摇了我对perl的误解:)虽然不可怕,但我认为代码仍然不清楚,因此它很简短,但不简洁。如果0=$,则显示
perl-lpe'切块%4'
给一些随机的C程序员,问他们它做什么。现在显示它们
awk'NR%4==0{sub(/.$/,“”)}1'文件
,这是等效文件。我并不是说awk脚本是完全清楚的,因为它依赖于
1
作为
{print}
的简写,以简洁明了,但我认为普通程序员一眼就能理解awk脚本的可能性要比理解perl脚本的可能性大得多。
$ awk 'NR%4==0{sub(/!$/,"")}1' file >tmp_file && mv tmp_file file
perl -lpe 'chop if 0 == $. % 4'
sed 'n;n;n;s/.$//' file
sed 'N;N;N;s/.$//' file