perl -F'\|' -wlane'print if $F[7] ne "U"' file > new
С помощью переключателя -a
каждая строка разбивается на слова, доступные в массиве @F
. Разделитель, на который нужно разделить, может быть установлен с помощью опции -F
(по умолчанию это пробел), а здесь это |
. Смотрите переключатели в perlrun . Затем мы просто проверяем 8-е поле и печатаем.
Чтобы изменить входной файл на месте добавить -i
switch
perl -i -F'\|' -wlane'print if $F[7] ne "U"' file
или используйте -i.bak
, чтобы также сохранить (.bak
) резервную копию.
Я вижу, что возник вопрос о регистрации тех строк, которые не хранятся в файле.
Один из способов - захватить для них поток STDERR
perl -i -F'\|' -wlane'$F[7] ne "U" ? print : print STDERR $_' file 2> excluded
где файл excluded
получает поток STDERR
, перенаправленный (в bash) с помощью 2>
. Однако это может быть совершенно опасно, поскольку теперь возможные предупреждения скрыты и повреждают файл, предназначенный для исключенных строк (поскольку они также идут в этот файл).
Так что лучше соберите эти строки и напечатайте их в конце
perl -i -F'\|' -wlanE'
$F[7] ne "U" ? print : push @exclude, $_;
END { say for @exclude }
' input > excluded
где файл excluded
возвращает все пропущенные (исключенные) строки. (Я переключил -e
на -E
, чтобы получить say
.)