Как удалить записи верхнего и нижнего колонтитула плоского файла с помощью сценария оболочки UNIX? - PullRequest
5 голосов
/ 16 ноября 2010

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

9 20050427 HEADER RECORD
0000000 00000 000000000 123456 00 654321 DATARECORD
0000000 00000 000000000 123456 00 654321 DATARECORD
0000000 00000 000000000 123456 00 654321 DATARECORD
0000000 00000 000000000 123456 00 654321 DATARECORD
6 20050427 TRAILER RECORD

Спасибо, Арун

Ответы [ 8 ]

10 голосов
/ 16 ноября 2010

... и с sed:

Как указано @ Барамин : минимальное количество для ввода sed '1d;$d', вот как это работает:

По номеру строки

sed -i'' -e '1d' -e '$d' yourfile

1d удаляет первую строку $d удаляет последнюю строку.

Или по шаблону

sed -r -i -e '/^[0-9] [0-9]{8} HEADER RECORD$/d' \
          -e '/^[0-9] [0-9]{8} TRAILER RECORD$/d' yourfile

-r требуется для{8} расширенное регулярное выражение.

Или оба

Если вы супер педантичны и хотите покрыть свою задницу самым жутким способом:

sed -r -i.bak -e '1{/^[0-9] [0-9]{8} HEADER RECORD$/d}' \
              -e '${/^[0-9] [0-9]{8} TRAILER RECORD$/d}' yourfile

-i'' изменит yourfile на месте.Удалите его, если вы хотите сохранить вывод в другом файле (например, с > outputfile в конце вашей строки).

8 голосов
/ 16 ноября 2010
tail -n +2 filename | head -n -1

У меня нет моего юникс-бокса для тестирования, поэтому эти числа могут быть 1 или 2, я не могу вспомнить, являются ли они ботом 1, обоими 2 или чем-то, но я все время это делаю (я просто перед тем я запускаю cmd, чтобы увидеть, если его 1 или два ... tail ... должен удалить первую строку, а head ... должен удалить последнюю

3 голосов
/ 16 ноября 2010

Это некрасиво, но, похоже, работает, по крайней мере, на вашем входе:

f='test.txt'; g=`wc -l $f`; h=`echo $g | cut -d ' ' -f1`; head -n $((h-1)) $f | tail -n $((h-2))

f - это имя вашего файла.Я не мог найти более быстрый способ избавиться от имени файла из вывода wc.Кто-то должен быть в состоянии справиться с этим.

Если вы хотите переписать тот же файл, просто перенаправьте вывод команды:

f='test.txt'; g=`wc -l $f`; h=`echo $g | cut -d ' ' -f1`; head -n $((h-1)) $f | tail -n $((h-2)) > $f
2 голосов
/ 25 ноября 2015

Очень простое решение для вашего вопроса

sed -i '1d;$d' yourfile
2 голосов
/ 16 ноября 2010

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

  • head -n -1 обрезает последнюю строку файла.
  • awk можно использовать для обрезания первой строки файла с помощью команды, подобной awk 'NR>1 {print}'

Кроме того, вы можете использовать grep -v, чтобы отфильтровать первую и последнюю строки, если они могут быть надежно идентифицированы по совпадениям строк.

0 голосов
/ 17 февраля 2016

Вот еще один вариант, который проще (если ваш хвост поддерживает семантику +)

tail -n +2 <file> | head -n -1

0 голосов
/ 16 ноября 2010

Просто, чтобы выбросить еще пару альтернатив:

awk -v last=$(wc -l < filename) 'NR == 1 || NR == last {next} {print}' filename
awk 'NR==1 {next} NR==2 {prev = $0; next} {print prev; prev = $0}' filename

Для перезаписи текущего файла, если вы не используете sed -i:

( whatever | pipeline ) <filename >filename.tmp && 
ln filename filename.bak &&
mv filename.tmp filename
0 голосов
/ 16 ноября 2010

Я понял это таким образом ... и спасибо всем за помощь.

wc -l fileman |awk '{print $1-0}' |xargs -i head -{} filename | sed -n '2,$p' > filename
...