У меня есть два файла, которые я хочу объединить. Однако последнюю строку первого файла и первую строку последнего файла следует опустить.
Я уверен, что это можно сделать в оболочке UNIX (или, скорее, Cygwin). Но как?
$ head --lines=-1 file1 > res
$ tail --lines=+2 file2 >> res
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
начинается с этой строки, а не через определенное количество строк от конца.
вы можете использовать:
head -n -1 file1 && tail -n +2 file2
head показывает первые строки файла, параметр -n показывает первые n строк файла, но если вы поставите - перед номером, он покажет весь файл, кроме последнего н строк.
хвост аналоговый..
для лучшего справки:
мужчина голова
человек хвост
head -n -1 file1
напечатает все строки в file1
, кроме последней строки.
tail -n +2 file2
напечатает все строки в file2
, кроме первой строки.
Объедините два как:
head -n -1 file1 ; tail -n +2 file2