Как удалить последний столбец файла в Linux

Я хочу удалить последний столбец txt-файла, в то время как я не знаю, что такое номер столбца. Как я могу это сделать?

Пример:

Входные данные:

1223 1234 1323 ... 2222 123 1233 1234 1233 ... 3444 125 0000 5553 3455 ... 2334 222 

И я хочу, чтобы мой результат был следующим:

 1223 1234 1323 ... 2222 1233 1234 1233 ... 3444 0000 5553 3455 ... 2334 

6 Solutions collect form web for “Как удалить последний столбец файла в Linux”

С awk :

 awk 'NF{NF-=1};1' <in >out 

или:

 awk 'NF{NF--};1' <in >out 

или:

 awk 'NF{--NF};1' <in >out 

Хотя это похоже на вуду, оно работает. Каждая из этих команд awk состоит из трех частей.

Первый – это NF , что является предварительным условием для второй части. NF – это переменная, содержащая количество полей в строке. В AWK все верно, если они не являются 0 или пустой строкой "" . Следовательно, вторая часть (где NF уменьшается) происходит только тогда, когда NF не равно 0.

Вторая часть (либо NF-- NF-=1 NF-- либо --NF ) просто вычитает один из переменной NF . Это предотвращает печать последнего поля, потому что, когда вы меняете поле (в последнем случае awk последнее поле), awk переконструирует $0 , по умолчанию соедините все поля, разделенные пробелом. $0 больше не содержит последнего поля.

Заключительная часть – 1 . Это не волшебство, оно просто используется как выражение, которое означает true . Если выражение awk оценивается как true без какого-либо связанного действия, действие awk default равно print $0 .

Использование grep с помощью PCRE:

 $ grep -Po '.*(?=\s+[^\s]+$)' file.txt 1223 1234 1323 ... 2222 1233 1234 1233 ... 3444 0000 5553 3455 ... 2334 

Использование GNU sed :

 $ sed -r 's/(.*)\s+[^\s]+$/\1/' file.txt 1223 1234 1323 ... 2222 1233 1234 1233 ... 3444 0000 5553 3455 ... 2334 

Использование Perl:

 perl -lane '$,=" ";pop(@F);print(@F)' in 

Использование rev + cut :

 rev in | cut -d ' ' -f 2- | rev 

Использование GNU sed:

 sed -r 's/\s+\S+$//' input.txt 

В более общем плане это работает с BSD sed в OSX, а также с GNU sed:

 sed 's/[[:space:]]\{1,\}[^[:space:]]\{1,\}$//' input.txt 

Если разделитель всегда является одним символом (поэтому два или более последовательных разделителя обозначают пустые поля), вы можете head только первую строку из вашего входного файла, подсчитать разделители ( n разделителей означает, что число полей равно n+1 ), а затем использовать cut для печати с 1 го поля до n го поля (второе и последнее), например, с вкладом с разделителями табуляции:

 n=$(head -n 1 infile | tr -dc \\t | tr \\t \\n | wc -l) cut -f1-$n infile > outfile 

или, например, с файлом csv :

 n=$(head -n 1 infile | tr -dc , | tr , \\n | wc -l) cut -d, -f1-$n infile > outfile 

Я буду запускать некоторые тесты позже, если у меня будет время, но с огромным входом. Я думаю, что это решение должно быть быстрее, чем другие решения, которые используют регулярное выражение, так как это делает минимальную обработку на первой строке, чтобы получить значение no. полей, а затем использует cut который оптимизирован для этой работы.

Использование vim:

Открыть файл в vim

 vim <filename> 

Перейдите к первой строке, на всякий случай, когда курсор помещен где-нибудь еще.

 gg 

Создайте макрос с именем «q» qq , который переместится в обратную сторону текущей строки $ , затем вернется к последнему пространству F (капитал F, за которым следует буквальное пространство), затем удалите из текущей позиции через конец строки D вниз следующую строку j и остановить макросъемку с помощью q .

 qq$F Djq 

Теперь мы можем повторить наш макрос с @q для каждой строки.
Мы также можем нажать @@ чтобы повторить последний макрос или еще проще:

 99@q 

повторить макрос 99 раз.
Примечание. Номер не должен точно соответствовать строкам.

  • Bash при поиске цикла и замене с помощью sed
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Как добавить строку в первый столбец файла матрицы?
  • Как удалить строки, содержащие некоторые имена в одном столбце в файлах txt
  • Как я могу извлечь / изменить строки в текстовом файле, данные которого разделены на поля?
  • извлекать символы before () с помощью grep
  • Как заменить последнее вхождение шаблона в третью последнюю строку файла
  • Замена пустого пространства без нуля
  • grep awk или sed CSV Row, содержащий определенную часть веб-адреса
  • Заменить шаблон в файле с шаблоном во втором файле
  • Как grep заголовок в man-странице, содержащей управляющие символы
  • Я хотел бы стереть предыдущую точку нескольких строк текста
  • Linux и Unix - лучшая ОС в мире.