AWK для использования нескольких пробелов в качестве разделителя

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

awk 'NR==FNR{a[,]=substr(,3);next} (,) in a{print , a[,] > "br0102_3.txt"}' br01.txt br02.txt

теперь по умолчанию команда AWk использует пробелы в качестве разделителей. Но мой файл может содержать один пробел между двумя словами, например

1:
ABCD               TEXT1 TEXT2                     123123112312312312312312312312312312
BCDEFG             TEXT3TEXT4                      133123123123123123123123123125423423
QWERT              TEXT5TEXT6                      123123123123125456678786789698758567
2:
ABCD               TEXT1 TEXT2                     12312312312312312312312312312
BCDEFG             TEXT3TEXT4                      31242342342342342342342342343
MNHT               TEXT8 TEXT9                     31242342342342342342342342343

мне нужен файл результатов как;

ABCD               TEXT1 TEXT2                     123123112312312312312312312312312312 12312312312312312312312312312
BCDEFG             TEXT3TEXT4                      133123123123123123123123123125423423 31242342342342342342342342343
QWERT              TEXT5TEXT6                      123123123123125456678786789698758567
MNHT               TEXT8 TEXT9                     31242342342342342342342342343

какие-то намеки ?

2 ответов


awk поддерживает регулярное выражение как значение FS таким образом, вы можете указать регулярное выражение, которое соответствует по крайней мере двум пробелам. Что-то вроде -F '[[:space:]][[:space:]]+'.

$ awk '{print NF}' File2
4
3
4

$ awk -F '[[:space:]][[:space:]]+' '{print NF}' File2
3
3
3

вы используете поля фиксированной ширины, поэтому вы должны использовать GNU awk FIELDWIDTHS (или аналогичные) для разделения полей, например, если 2-е поле-это 15 символов от char 8 до char 23 включительно в этом файле:

$ cat file
abc    def ghi        klm
AAAAAAAB C D E F G H IJJJJ
abc       def ghi     klm

$ awk -v FIELDWIDTHS="7 15 4" '{print "<"  ">"}' file
<def ghi        >
<B C D E F G H I>
<   def ghi     >

любое решение, которое полагается на определенное количество пробелов между полями, потерпит неудачу, если между полями есть 1 или ноль пробелов.

Если вы хотите очистить ведущие / конечные пробелы от ваших целевых полей:

$ awk -v FIELDWIDTHS="7 15 4" '{gsub(/^\s+|\s+$/,"",); print "<"  ">"}' file
<def ghi>
<B C D E F G H I>
<def ghi>