Как отследить два файла друг за другом, но пропустить последнюю / первую строку соответственно?
У меня есть два файла, которые я хочу катать вместе. Однако последняя строка первого файла и первая строка последнего файла должны быть пропущены.
Я уверен, что это можно сделать в оболочке 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