Я хочу удалить последний столбец текстового файла, пока я не знаю, что такое номер столбца. Как я мог это сделать?
Пример:
Входные данные:
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
text-processing
sed
awk
perl
Зара
источник
источник
Ответы:
С
awk
:или:
или:
Хотя это выглядит как вуду, это работает. Каждая из этих команд awk состоит из трех частей.
Первый
NF
, который является предварительным условием для второй части.NF
переменная, содержащая количество полей в строке В AWK все верно, если они не 0 или пустая строка""
. Следовательно, вторая часть (гдеNF
уменьшается) происходит только еслиNF
не 0.Вторая часть (или
NF-=1
NF--
или--NF
) просто вычитает одну изNF
переменной. Это предотвращает печать последнего поля, потому что при изменении поля (в этом случае удаляется последнее поле)awk
воссоздайте$0
, объедините все поля, разделенные пробелом по умолчанию.$0
больше не было последнего поля.Заключительная часть есть
1
. Это не волшебство, это просто выражение, которое означаетtrue
. Еслиawk
выражение имеет значение true без какого-либо связанного действия,awk
действие по умолчанию равноprint $0
.источник
--
. Примечание, в настоящее время вам нужно;1
для POSIX-совместимого.,
, ваш разделитель:awk -F',' 'BEGIN { OFS = FS }; NF { NF -= 1 }; 1' < in > out
Использование
grep
с PCRE:Используя GNU
sed
:источник
Использование Perl:
Используя
rev
+cut
:источник
Использование GNU sed:
В более общем смысле, этот работает с BSD sed в OSX, а также с GNU sed:
источник
Если в качестве разделителя всегда используется один символ (поэтому два или более последовательных разделителей обозначают пустые поля), вы можете
head
просто указать первую строку в вашем входном файле, сосчитать разделители (n
разделители означают количество полейn+1
), а затем использоватьcut
для печати из1
поля st. доn
поля th (от второго до последнего), например, с вводом, разделенным табуляцией:или, например, с помощью файла CSV :
Я проведу несколько тестов позже, если у меня будет время, но с огромным вкладом я думаю, что это решение должно быть быстрее, чем другие решения, использующие регулярное выражение, так как это делает минимальную обработку в первой строке, чтобы получить нет. полей, а затем использует
cut
который оптимизирован для этой работы.источник
Портативно вы можете использовать любой из них:
источник
Используя vim:
Открыть файл в vim
Перейти на первый ряд, на всякий случай, если курсор находится в другом месте.
Создайте макрос с именем «q»
qq
, который идет в конец текущей строки$
, затем возвращается к последнему пробелуF
(заглавная буква F, затем пробел ), затем удаляется из текущей позиции до конца строки,D
спускается до следующей строкиj
и остановить запись макроса с помощьюq
.Теперь мы можем повторить наш макрос с
@q
каждой строкой.Мы также можем нажать,
@@
чтобы повторить последний макрос или даже проще:повторить макрос 99 раз.
Примечание. Число не должно точно соответствовать строкам.
источник
Для людей, имеющих похожую проблему, но с разными разделителями полей, этот
awk
метод будет правильно сохранять разделитель полей:источник