Удалить последний символ каждой n-й строки на месте - PullRequest
0 голосов
/ 15 октября 2018

У меня есть файл с четырьмя повторными строками.Я ищу, чтобы удалить последний символ каждой четвертой строки.Описание файла ниже.

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

Я пытаюсь удалить последний символ (восклицательный знак) из каждой четвертой строки показателя качества.

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

Я могу использовать awk для извлечения каждой четвертой строки, но как мне удалить последний символ на месте в каждой четвертой строке файла ?

Этот вопрос работает только по определенной строке.В настоящее время мой подход заключается в использовании awk для получения показателя качества, и я могу удалить последнего персонажа с помощью sed.

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

В настоящее время я не уверен, как переписать отредактированные показатели качества в исходный файл.Любые мысли или более сжатые аргументы sed / awk приветствуются.

Ответы [ 5 ]

0 голосов
/ 16 октября 2018

Это может работать для вас (GNU sed):

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

Или

sed 'N;N;N;s/.$//' file
0 голосов
/ 15 октября 2018

Perl в помощь!

perl -lpe 'chop if 0 == $. % 4'
  • -p читает строку ввода построчно и печатает ее после обработки
  • -l удаляет новую строку из строки вводаи добавляет его обратно к выводу
  • chop удаляет последний символ
  • $. это специальный perlvar , который содержит номер строки ввода, % является оператором по модулю
0 голосов
/ 15 октября 2018

Не могли бы вы попробовать следующее.

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).

0 голосов
/ 15 октября 2018

Дано:

$ 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 ​​в любом случае делают под прикрытием с помощью 'замена на месте ...)

0 голосов
/ 15 октября 2018

GNU-sed имеет расширение, которое может работать с каждой n-й строкой:

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

m~n означает, что в m -ой строке повторяется каждые n строки, выполните следующую командукоманда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...