Фильтровать файл и отправлять строки в одном из двух файлов

Мне нужно создать два файла из одного файла в соответствии со следующими правилами: Для каждой строки входного файла,

  • Если все символы от позиции x до позиции y являются пробелами, запишите строку в выходной файл A
  • В противном случае запишите файл в выходной файл B

Я мог бы написать это легко на ksh, но мне было интересно, если нет лучшего способа, используя grep / sed / awk или любой другой инструмент. Я не эксперт в awk или sed, но проблема в том, что есть два выходных файла, поэтому я не могу использовать перенаправления потоков оболочки.

Я прочитал некоторую документацию по awk и sed, но ничего не нашел по обработке нескольких выходных файлов.

Есть идеи?

Вот пример с x = 17 и y = 19:

Входной файл:

test.empty.field   .test
test.non.emptyfield.test

Выходной файл A

test.empty.field   .test

Выходной файл B

test.non.emptyfield.test

Входной файл не является CSV-файлом, так что я могу использовать только цифры символов, чтобы проверить значение. Без разделителей.

3 ответа

Решение

Что-то вроде:

awk -v x=10 -v y=15 '{
    out = (substr($0, x, y-x+1) ~ /[^[:space:]]/) ? "B" : "A"
    print > out
}' file

Вот как вы это делаете с awk

cat file
1234   89
123   789
123456789

Печать на file1 все строки с пробелом из позиции 4 в 6отдохни file2

awk 'substr($0,4,3)=="   " {print > "file1";next} {print > "file2"}' file

cat file1
123   789

cat file2
1234   89
123456789

С sed:

pat=[[:space:]] patcol=5 n=3 fileA=A fileB=B

sed -nE "
      /^.{$((patcol-1))}$pat{$n}/ w $fileA
      //!                         w $fileB
" <<EOD
1234   89
1234  789
12345  89
EOD

cat A
cat B
Другие вопросы по тегам