2013-08-15 3 views
1

Я использую следующую команду:Как автоматически игнорировать последние три строки файла?

head -36 file.txt > file1.txt 

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

+0

Это может помочь вам больше, если вы спросите, что вы ДЕЙСТВИТЕЛЬНО пытаетесь достичь, то есть что не так с последними 3 строками в вашем файле – Adrian

+0

просто этот файл является моим входным файлом, поэтому иногда мне нужны последние 3 строки, иногда я не – t28292

+0

Ни один из ответов не работал? есть ли у вас другие предложения? – t28292

ответ

1

А вот AWK единственное решение (без замены процессов, трубопроводов и т.д.)

awk 'NR==FNR{k++;next}FNR<=k-3' file.txt file.txt 

Объяснение:

  • Мы добавляем файл .txt два раза, так что awk читает его дважды. В первый раз он подсчитывает общее количество строк в файле, а второй раз печатает все строки, за исключением последних трех
  • NR==FNR{k++;next}: Переменная NR - это номер записи (включая файл), а FNR номер записи в текущем файле. Они равны только для записей в первом файле. Итак, для первого файла мы подсчитываем строки в нем, с k++, а затем пропускаем оставшиеся команды с next.
  • FNR<=k-3 Если переменная FNR меньше, чем полные строки в файле (которые мы подсчитали в предыдущей пуле) - 3, тогда выражение оценивается как true, а строка печатается. В противном случае выражение оценивается как false (для последних трех строк), и строка не печатается. Это происходит только для второго файла из-за команды next в предыдущем блоке.
+0

никогда не используйте букву 'l' (el) в качестве имени переменной, поскольку она выглядит слишком сильно, как номер' 1' (один). Я как-то провел 3 часа, глядя и отлаживая синтаксическую ошибку в чужом сценарии, потому что она научилась вводить класс, что быстрее было набирать '1', чем' l' (или наоборот), и поэтому он использовал это в программа - извлеченный урок ... –

+1

@EdMorton Хорошая точка. У меня был l для «линии», но k так же хорош. Конграды по достижении 10K кстати :) – user000001

+1

Спасибо. Теперь, где я торгую этим за наличные? Я думаю, что пропустил записку ... –

-1

Это должно работать

head -n -3 file.txt 

От man head

-n, --lines=[-]K 
      print the first K lines instead of the first 10; with the leading '-', print all but the last K lines of each file 
+0

Не работает на BSD - возможно, Linux-only - не уверен в Solaris? –

+0

Это не отвечает на вопрос. OP хочет вычесть 3 строки из общего количества строк в файле НЕ читать 3 строки сверху ... – iamauser

+1

@iamuser, пожалуйста, прочитайте страницу руководства. С ведущим - как в '-3', голова печатает все, кроме последних 3 строк, это не то же самое, что вычесть последние 3 строки. – Vivek

0

Эй вы хотите, чтобы сказать ему, сколько строк нужно исключить, а не сколько вы будете в конечном итоге с.

Также добавьте -n, чтобы проверить наличие пустого файла.

head -n -3 file.txt 


Если бы не попробовать с временным файлом

head -n -3 file.txt > temp.txt ; mv temp.txt file.txt 
2
nl=`wc -l file.txt | awk 's=$1-3{print s}'`; head -n $nl file.txt 

wc -l вычисляет общее количество строк. Используя awk, вы можете распечатать общее количество строк -3. Затем используйте head только для чтения, что много линий ...

+0

комментариев добавили – t28292

+0

что это за ошибка? – iamauser

3
awk -v nr=$(wc -l <file) 'NR<(nr-2)' file 
+0

Файл такой же входной файл? – t28292

+0

Я попробовал, что представленный комментарий не может открыть файл NR (nr-2) – t28292

+0

Да и вы упустили '-v'. Скопируйте/вставьте то, что я разместил, не пытайтесь повторно ввести его. –

Смежные вопросы