Как отследить два файла друг за другом, но пропустить последнюю / первую строку соответственно?

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

Я уверен, что это можно сделать в оболочке UNIX (точнее, Cygwin). Но как?

7 ответов

Решение
$ head --lines=-1 file1 > res
$ tail --lines=+2 file2 >> res

Я не могу использовать следующую команду на моем Mac (точнее, в оболочке bash, запущенной в окне терминала в Mac OS X 10.7.5):

head -n -1 file1

Команда выше генерирует следующее сообщение об ошибке:

head: illegal line count -- -1

Похоже, что отрицательные значения параметра -n не принимаются в версии главы Mac OS X. Однако вместо этого вы можете использовать sed:

sed -e '$d' file1

["tail -n +2 file2" работает, как описано выше в Mac OS X]

Ты можешь использовать:

head -n -1 file1 && tail -n +2 file2

head показывает первые строки файла, параметр -n показывает первые n строк файла, но если вы поставите - перед числом, он покажет весь файл, кроме последних n строк.

хвост аналог..

для лучшего ознакомления:

человек head

человек tail

head -n -1 file1

напечатает все строки в file1 кроме последней строки.

tail -n +2 file2

напечатает все строки в file2 кроме первой строки.

Объедините два как:

head -n -1 file1 ; tail -n +2 file2
awk 'FNR>2{print p}{p=$0}' file1 file2

Объяснение по запросу:

FNR - номер текущей записи текущего обрабатываемого файла. В начале каждой итерации строка сохраняется в переменной "p", но пока не распечатывается. Когда номер записи достигает 3, выводится переменная "p", которая содержит запись 2. Это означает 2-ю строку. Когда awk достигает конца файла, последняя строка не распечатывается, а затем переходит к следующему файлу.

Следующий транскрипт показывает, как добиться этого:

pax> cat file1.txt
1.1
1.2
1.3
1.4
1.5

pax> cat file2.txt
2.1
2.2
2.3
2.4
2.5

pax> head --lines=-1 file1.txt ; tail --lines=+2 file2.txt
1.1
1.2
1.3
1.4
2.2
2.3
2.4
2.5

Давая head команда отрицательный счет идет до того, что далеко от конца. Точно так же, отсчет начинается с + причины tail начинать с этой строки, а не с определенного количества строк с конца.

Я часто использую sed для головы | хвост действий:

{ sed '$d' file1; sed '1d' file2; } > combined
Другие вопросы по тегам