Удалить все столбцы после - PullRequest
       7

Удалить все столбцы после

0 голосов
/ 04 декабря 2018

Как я могу удалить все после n-го столбца на месте?

С

My name is Chris dfgwer5hy4w5hwret
Bob is his name 41rgadfg agaojpr ge]f8098
A guy called karl gWE GWEG34YHTJ eeg452 yfg

До

My name is Chris
Bob is his name
A guy called karl

Предпочитают, если он также удаляет все пробелы.

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

sed -i -r 's/\S+//5'

Спасибо, Крис

Ответы [ 5 ]

0 голосов
/ 05 декабря 2018

Это может работать для вас (GNU sed):

sed -ri 's/\s+\S+//4g' file

Удалите четвертую и более группу пробелов, за которыми следует непустой пробел, и верните отредактированный файл на место.

0 голосов
/ 04 декабря 2018

Если вы предпочитаете Perl, ниже будет работать

$ cat chris.txt
My name is Chris dfgwer5hy4w5hwret
Bob is his name 41rgadfg agaojpr ge]f8098
A guy called karl gWE GWEG34YHTJ eeg452 yfg

$ perl -i -lane ' print join " ", @F[0..3] ' chris.txt

$ cat chris.txt
My name is Chris
Bob is his name
A guy called karl

$
0 голосов
/ 04 декабря 2018

Если это после строки, а не после n-го столбца, как предполагал RavinderSingh13:

cat file.txt | sed 's/^\(My name is [a-z]*\).*/\1/'
0 голосов
/ 04 декабря 2018

С любым awk:

$ awk '{sub("([[:space:]]*[^[:space:]]+){"NF-4"}[[:space:]]*$","")}1' file
My name is Chris
Bob is his name
A guy called karl

С GNU awk вы можете сделать awk -i inplace 'script' file, чтобы получить то же псевдо-редактирование на месте, которое вы получаете с sed -i или perl -i, и вы можете вручную выполнить точно внешнечто они все делают внутренне с любой командой, просто command 'script' file > tmp && mv tmp file, например

cut -d' ' -f1-4 file > tmp && mv tmp file
0 голосов
/ 04 декабря 2018

Не могли бы вы попробовать следующее (проверено в GNU awk).Для сохранения результатов на месте добавьте > temp_file && mv temp_file Input_file к следующим кодам.

awk 'NF=4'  Input_file

Объяснение: NF это awk из коробкипеременная, которая указывает количество полей в текущей строке (по умолчанию он рассматривает разделитель полей как пробел), поэтому я вручную устанавливаю его значение равным 4 здесь, согласно вопросу OP.Теперь awk работает с методом pattern / condition и action, поэтому здесь никаких действий не предусмотрено, поэтому по умолчанию будет печататься текущая строка с отредактированным количеством полей.

ИЛИ вы также можете использовать следующие, как указаноавтор ghoti в комментариях.

awk '{NF=4;$1=$1}1'  Input_file

Решение 2-е: Добавление решения sed тоже сейчас.Учитывая, что ваш фактический Input_file такой же, как показанные примеры.Для сохранения вывода в сам файл Input_file используйте опцию sed -i для следующего кода.

sed 's/\(.* is [^ ]*\)\(.*\)/\1/' Input_file

Решение 3-е: В случае, если ваша система имеет gensub in awk GNU один, то следующее может помочь вам здесь.

awk '{reg="(.* is [^ ]*).*";print gensub(reg, "\\1", 1, $0)}'  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...