2014-02-09 4 views
1

Мне нужно вырезать строки из файла фиксированной длины и вставить его в новый файл для строк, начинающихся с 180, а позиция 35 имеет «N». Я использую ** Баш **Удалить строку на основе значения столбца в unix

**Sample input file:** 
070000001                       075PRMAGDALENA F DEL                         180AP997270518411     Y02092014 
180AP997270518412     N02092014 
180AP997270518413     N03212013 
PAYMNT                        
190EM037490013798700                     
070000002                       075PRRERUCHA TROY A                         195097130808020800                     070000003                        
180AP997270518423     Y03212013 
**Sample input end** 

Код: конец

while IFS= read -r line 
do 

## var=$((var+1)) 
    if [ ${line:0:3} = '180' ] && [ ${line:34:1} = 'N' ] ; 
    then 
    echo $line > online_error.txt 
    else 
    echo $line > online_good.txt 
    fi 
done <"$file" 

Код

** запуска Выход **

180AP997270518423 N03212013

** Выходной конец ** В приведенном выше выводе пробелы теряются. Я бы хотел, чтобы мой вывод имел аналогичный интервал в качестве моей строки ввода. Буква «N» позиционируется в 35 в моем входном файле, где, как и в выводе, ставится на 19.

Если часть записи записывается в файл, однако я потерял форматирование. Мне нужно сохранить исходное форматирование, поскольку вывод из этого сценария вводится для другой программы мэйнфрейма.

Просьба представить предложения.

+0

Что значит «Я потерял форматирование»? – Floris

+1

Используйте 'echo '$ line" 'для сохранения интервала в строках. –

+0

echo $ line, как-то не сохраняя промежуток – user3290216

ответ

1

Вы могли бы рассмотреть следующий вариант:

cat b.txt | grep -E '^180.{32}N' > newFile.txt 

Чтобы извлечь строки, которые начинаются с 180 и имеют N в колонке 35; и

cat b.txt | grep -E -v '^180.{32}N' > remainder.txt 

для всех остальных.

Примечание - флаг -E - это тот, который используется в Mac OS для «расширенного регулярного выражения». В качестве альтернативы вы можете использовать egrep - тогда вам не нужен флаг. Я думаю, что это то же самое в других версиях Unix.

Если вы уверены, что буква во втором столбце всегда «первая буква через пробел» вы также можете попробовать

egrep '^180.* N' <b.txt> newFile.txt 

и его дополнение:

egrep -v '^180.* N' <b.txt> newFile.txt 
+0

Я использовал egrep, а остальная часть отлично работает, но newFile была создана без записей. – user3290216

+0

Это странно, потому что флаг '-v' говорит« все, что не соответствует », поэтому вы ожидаете, что идентичное выражение _without_ -v' будет генерировать все остальное ... Есть ли вообще шанс, который вы сделали опечатка? – Floris

2

Предполагая, что «позиция 35 равна N» и «второе поле начинается с N» эквивалентно, вы можете использовать команду

awk '$1 ~ /^180/ && $2 ~ /^N/ { 
     print $0 > "online_error.txt"; 
     next; 
    } 
    { print $0 > "online_good.txt" }' "$file" 
+0

Работал !! Благодарю. – user3290216

Смежные вопросы