删除每第n行的最后一个字符

时间:2018-10-15 14:45:34

标签: bash text awk sed

我有一个包含四行重复的文件。我希望删除每四行的最后一个字符。该文件的说明如下。

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

我正在尝试从每四个质量得分行中删除最后一个字符(感叹号)。

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

我可以使用awk抽出第四行,但是如何删除文件第四行中的最后一个字符

documentation on constructing queries仅在特定行上运行。目前,我的方法是使用awk拉出质量得分,并且我可以使用sed删除最后一个字符。

awk 'NR == 4 || NR % 4 == 0'
sed 's/.$//'

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

5 个答案:

答案 0 :(得分:6)

GNU-sed具有可以在第n行上运行的扩展:

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

m~n表示在第m行的第n行上重复执行以下命令。

答案 1 :(得分:3)

给出:

$ 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在后台进行“就地”替换的做法是什么……)

答案 2 :(得分:3)

抢救Perl!

perl -lpe 'chop if 0 == $. % 4'
  • -p逐行读取输入,并在处理后将其打印
  • -l从输入行中删除换行符并将其添加回输出中
  • chop删除最后一个字符
  • $.是包含输入行号的特殊perlvar%是模数operator

答案 3 :(得分:1)

请您尝试以下。

awk 'FNR%4==0{print substr($0,1,length($0)-1);next} 1' Input_file > temp_file && mv temp_file Input_file

这会将输出保存到Input_file本身(它将创建名为temp_file的输出目录,然后将temp_file重命名/移动到实际的Input_file)。

答案 4 :(得分:0)

这可能对您有用(GNU sed):

sed 'n;n;n;s/.$//' file

sed 'N;N;N;s/.$//' file