раскол столбца после n-го символа

Я пытаюсь разделить мой второй столбец в файле ниже после каждых 4 символов.

file.txt

>1A THISISATEST >1B THATISATEST 

желаемый выход:

 >1A THIS ISATEST >1B THAT ISATEST 

После поиска и попытки изменения я попытался использовать эту команду sed: sed 's/(.{4})(.{7}).*/\2 \3/' file.txt . Однако я не могу заставить его работать. Я что-то упускаю? Однако, если у вас есть awk предложение, это также будет полезно. Также, пожалуйста, объясните свои предложения. Я участвую в процессе обучения awk и sed .

Вот решение с awk . Он отделяет первые четыре символа и остальную часть второго столбца от двух переменных и печатает их.

 ]$ awk '{s=substr($2,1,4)}{g=substr($2,5,length($2))}{print $1,s,g}' file.txt 1A THIS ISATEST 1B THAT ISATEST 

С sed :

 sed 's/^[^ ]\+ \+[^ ]\{4\}/&\t/' 

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

  • ^ : начало строки
  • [^ ]\+ : не пробел, совпадающий по крайней мере один раз
  • \+ : символ пробела, сопоставленный хотя бы один раз
  • [^ ]\{4\} : не символ пробела, совпадающий ровно четыре раза
  • & : все соответствует предыдущему //
  • \t : вкладка

Вывод:

 >1A THIS ISATEST >1B THAT ISATEST 

Положительно правильно:

 sed 's/^[^ ][^ ]* *[^ ]\{4\}/&\t/' 

Шаблон + является расширением GNU, поэтому нужно имитировать его с повторяющимся символом и * для совместимости с posix.

 sed 's/ [^ ]\{1,4\}/& /' <in >out 

 >1A THIS ISATEST 

Он будет работать, чтобы вставить <пробел> после самого длинного совпадения первого вхождения последовательности из 1 – 4 непространственных символов сразу после символа пробела. Это означает, что если строка начинается с пробелов, это повлияет на первую не-пространственную последовательность (это, вероятно, правильное поведение) , или если второй столбец, разделенный пробелом, состоит из четырех или менее символов, он добавит дополнительное пространство в этот столбец (что, возможно, является неправильным поведением) .

Ни в коем случае он не заменяет пробел для каждого четвертого непространственного символа во втором столбце, хотя он преобразует пример ввода в вывод примера.

С GNU awk

 awk -F'\t' -vOFS='\t' ' {patsplit($2, a, /.{4}/); $2=""; for (k in a) $2=$2($2?"\t":"")a[k]; print}' file 

Используйте patsplit чтобы разделить второе поле ( $2 ) на 4 символьных фрагмента, хранящихся в массиве a . Присоедините куски назад с помощью разделителя вкладок и установите в поле 2 перед печатью записи

 1A THIS ISATEST 1B THAT ISATEST 

С GNU awk вы можете использовать FPAT

 awk '{$1=$1}1' OFS='\t' FPAT='>..\\s+\\w{4}|\\w*$' 
  • выражение >..\\s+\\w{4} соответствует >1A THIS и \\w*$ соответствует остальной строке.

  • $1=$1 заставляет выводить строку с новым разделителем OFS

  • 1 заменяет {print $0}