我有一个包含四行重复的文件。我希望删除每四行的最后一个字符。该文件的说明如下。
@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参数都将不胜感激。
答案 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'
答案 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