Фильтровать файл и отправлять строки в одном из двух файлов
Мне нужно создать два файла из одного файла в соответствии со следующими правилами: Для каждой строки входного файла,
- Если все символы от позиции 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