Неожиданное обновление переменной при использовании оператора bash $ (()) для арифметики - PullRequest
1 голос
/ 18 ноября 2011

Я пытаюсь обрезать несколько строк из файла. Я точно знаю, сколько строк нужно удалить (скажем, 2 сверху), но не сколько строк в файле. Поэтому я попробовал это простое решение:

$ wc -l $FILENAME
119559 my_filename.txt
$ LINES=$(wc -l $FILENAME | awk '{print $1}')
$ tail -n $(($LINES - 2)) $FILENAME > $OUTPUT_FILE

Вывод в порядке, но что случилось с линиями ??

$ wc -l $OUTPUT_FILE
119557 my_output_file.txt
$ echo $LINES
107

Надеясь, что кто-то может помочь мне понять, что происходит.

Ответы [ 3 ]

5 голосов
/ 18 ноября 2011

$LINES имеет особое значение. Это количество строк в терминале, и если вы измените размер окна терминала, оно будет сброшено. Смотри info "(bash)Bash Variables".

0 голосов
/ 18 ноября 2011

Вы также можете просто сделать sed 'X,Yd' < file

Где X, Y - диапазон строк, которые вы хотите опустить (в данном случае это будет 1,2).

Другие альтернативы:

sed 'X,+Yd' пропускает Y строк, начинающихся со строки X

sed /regex/,Yd' пропускает все между строкой, в которой совпадает регулярное выражение, и Y

sed '/regex/,+Yd' пропускает Y строк, начиная с которых совпадает регулярное выражение

sed '/regex/,/regex/d' пропускает все между двумя регулярными выражениями

Примечание: это расширения GNU sed

0 голосов
/ 18 ноября 2011

Это всегда помогает разложиться там, где есть проблема.Запуск

 wc -l $FILENAME | awk '{print $1}'

, вероятно, покажет вам, в чем проблема.

Вместо этого используйте

LINES=$(wc -l < $FILENAME )

Хм .. Да, я боюсь, что @MichaelHoffman, вероятно,диагностировал вашу проблему более точно.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...