У меня есть два файла, которые я хочу сшить вместе. Тем не менее, последняя строка первого файла и первая строка последнего файла должны быть опущены.
Я уверен, что это можно сделать в оболочке UNIX (точнее, Cygwin). Но как?
У меня есть два файла, которые я хочу сшить вместе. Тем не менее, последняя строка первого файла и первая строка последнего файла должны быть опущены.
Я уверен, что это можно сделать в оболочке UNIX (точнее, Cygwin). Но как?
$ head --lines=-1 file1 > res
$ tail --lines=+2 file2 >> res
вы можете использовать:
head -n -1 file1 && tail -n +2 file2
head показывает первые строки файла, параметр -n показывает первые n строк файла, но если вы поместите a - перед номером, он отображает весь файл, кроме последних n строк.
tail является аналоговым.
для лучшей справки:
человек head
человек tail
awk 'FNR>2{print p}{p=$0}' file1 file2
Объяснение по запросу:
FNR - текущий номер записи текущего обрабатываемого файла. В начале каждой итерации строка сохраняется в переменной "p", но она еще не распечатана. Когда число записей достигает 3, изменяется переменная "p", которая содержит запись 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
начинать с этой строки, а не определенное количество строк с конца.
head -n -1 file1
напечатает все строки в file1
, кроме последней строки.
tail -n +2 file2
будет печатать все строки в file2
, кроме первой строки.
Объедините их как:
head -n -1 file1 ; tail -n +2 file2
Я не могу использовать следующую команду на своем 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]
Я часто использую sed
для действий head | tail:
{ sed '$d' file1; sed '1d' file2; } > combined