bash — обрезка четных строк в текстовом файле

Я хотел бы удалить первые символы X и последние символы Y из всех четных строк файла с помощью bash.

Вход:

1
AABBBBBCCC
2
GKDDABC

пусть X=2 и Y=3:

1
BBBBB
2
DD

person ahb65    schedule 20.10.2014    source источник


Ответы (3)


Использование awk:

$ awk -v x=2 -v y=3 '0==NR%2 {$0=substr($0,x+1,length($0)-y-x)} 1' file
1
BBBBB
2
DD

Как это работает:

  • -v x=2 -v y=3

    Параметры -v определяют две наши переменные, x и y.

  • 0==NR%2 {$0=substr($0,x+1,length($0)-y-x)}

    NR - счетчик строк. Когда 0 == NR%2, мы находимся на четной строке и удаляем x символов с начала и y с конца. В awk $0 это вся строка. Мы заменяем подстроку, которая начинается с позиции x+1 и имеет длину length($0)-y-x.

  • 1

    Это загадочное сокращение для печати строки.

person John1024    schedule 20.10.2014

Gnu sed имеет оператор адреса шага ~. 2~2 означает "начать со строки 2, совпадать с каждой второй строкой".

x=2 
y=3 
sed "2~2{s/^.\{$x\}//;s/.\{$y\}$//}" input
person choroba    schedule 20.10.2014

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

sed -r 'n;s/^.{2}(.*).{3}$/\1/' file

или если вы хотите параметризовать:

x=2 y=3
sed -r "n;s/^.{$x}(.*).{$y}$/\1/" file

Где n печатает нечетные строки, рисуя четные строки для команды подстановки.

person potong    schedule 21.10.2014