удалить последний разделитель в sed / awk / perl - PullRequest
1 голос
/ 22 октября 2019

Дан входной файл, каждая строка которого содержит данные с разделителями с дополнительным разделителем в конце в данных / заголовке с или без вложений.

Дополнительный разделитель в конце может содержать с пробелами или без них.

Сценарий 1: заголовок и данные содержат дополнительный разделитель в конце

eno|ename|address|
A|B|C|
D|E|F|

Сценарий 2: заголовок не содержит дополнительный разделитель в конце

eno|ename|address
A|B|C|
D|E|F|

Сценарий3: С корпусами

eno|ename|address|
1|2|"A"|

Окончательный результат должен быть таким, как

Сценарий 1:

eno|ename|address
A|B|C
D|E|F

Сценарий 2:

eno|ename|address
A|B|C
D|E|F

Сценарий3:

eno|ename|address
1|2|"A"

Решение, которое я пробовал до сих пор. Но приведенное ниже решение не будет работать для всех трех сценариев. В любом случае, я могу сделать одну команду для поддержки всех трех сценариев в Sed / Awk / Perl

perl -pne 's/(.*)\|/$1/' filename

Ответы [ 5 ]

2 голосов
/ 22 октября 2019

Не могли бы вы попробовать следующее.

awk '{gsub(/\|$|\| +$/,"")} 1'  Input_file

Объяснение:

gsub - это функция awk, которая глобально заменяет сопоставленный шаблон указанным значением.

Объяснение регулярного выражения:

/\|$|\| +$/: Здесь есть 2 части регулярного выражения. Первый - /\|$, а второй - +$, который сегрегируется с |, где 1-е регулярное выражение предназначено для удаления | из последней строки, а второе регулярное выражение удаляет | с пробелом в конце. Таким образом, он в основном успешно справляется с обоими условиями.

2 голосов
/ 22 октября 2019

Все, что вам нужно, это:

sed 's/|$//'
2 голосов
/ 22 октября 2019
perl -lpe 's/\|\s*$//' file

сделает это. При этом удаляются только каналы, за которыми следуют дополнительные пробелы в конце каждой строки. Обратите внимание на $ привязку строки.

Я добавил -l, поскольку новая строка каждой строки будет получать удаления по команде s///, а -l вернет ее обратно.

0 голосов
/ 24 октября 2019
perl -pi -e 's/\|$//' Your_FIle
0 голосов
/ 23 октября 2019

немного более общий. Предположим, у вас та же проблема, но с разными разделителями полей в разных файлах. Некоторые из этих разделителей полей являются регулярными выражениями (например, последовательность пробелов), другие - просто один символ c. С крошечной маленькой awk-программой вы можете далеко продвинуться:

# remove_last_empty_field.awk
# 1. Get the correct `fs`
BEGIN { fs=FS; if(length(FS)==1) fs=(FS==" ") ? "[[:blank:]]+" : "["FS"]" }
# remove the empty field
{ sub(fs"$","") }
# Print the current record
1

Теперь вы можете запустить это для ваших различных файлов как:

$ awk -f remove_last_empty_field.awk f1.txt
$ awk -f remove_last_empty_field.awk FS="|" f2.txt
$ awk -f remove_last_empty_field.awk FS="[|.*]" f3.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...