Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

$ head --lines=-1 file1 > res
$ tail --lines=+2 file2 >> res

Ответ 2

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

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

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

tail является аналоговым.

для лучшей справки:

человек head

человек tail

Ответ 3

awk 'FNR>2{print p}{p=$0}' file1 file2

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

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

Ответ 4

В следующей записи показано, как это сделать:

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 начинать с этой строки, а не определенное количество строк с конца.

Ответ 5

head -n -1 file1

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

tail -n +2 file2

будет печатать все строки в file2, кроме первой строки.

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

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

Ответ 6

Я не могу использовать следующую команду на своем 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]

Ответ 7

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

{ sed '$d' file1; sed '1d' file2; } > combined