Как удалить данные из номера телефона и последней запятой. используя sed или awk - PullRequest
1 голос
/ 17 апреля 2020

Так что в основном у меня есть текстовый файл с сотнями строк вроде этого ..

2020-04-13 17:09:58.934,/abc/blahblahblahI/v1/dennisritchie/7408058445,2020-04-13 17:09:58.687,2020-04-13 17:09:58.934
2020-04-13 17:09:59.387,/cde/bunnyrabbit/v1/tea/generate/9161455644,2020-04-13 17:09:59.322,2020-04-13 17:09:59.387
2020-04-13 17:09:59.567,/fgh/scoobybites/v1/shaggy/markup/7672748033,2020-04-13 17:09:59.459,2020-04-13 17:09:59.567
2020-04-13 17:09:59.640,/xxx/xxxxxxxxxxxxxx/v1/xxx/generate,2020-04-13 17:09:59.624,2020-04-13 17:09:59.640
2020-04-13 17:09:59.796,/yyyy/defoe/v1/aaaaaaaaaal/9820276621?noOfRecords=1&blahlahAccountNo,2020-04-13 17:09:59.523,2020-04-13 17:09:59.796
2020-04-13 17:09:59.780,/dcd/manual/v2/profile/9841001122?fields=billingArrangement,billingAccountNo,faId,2020-04-16 09:59:59.740,2020-04-16 09:59:59.825

Основная цель - выглядеть так, чтобы удалить все с номерами телефонов до последней запятой (только в линий с номерами телефонов), и это должно выглядеть следующим образом.

2020-04-13 17:09:58.934,/abc/blahblahblahI/v1/dennisritchie/,2020-04-13 17:09:58.687,2020-04-13 17:09:58.934
2020-04-13 17:09:59.387,/cde/bunnyrabbit/v1/tea/generate/,2020-04-13 17:09:59.322,2020-04-13 17:09:59.387
2020-04-13 17:09:59.567,/fgh/scoobybites/v1/shaggy/markup/,2020-04-13 17:09:59.459,2020-04-13 17:09:59.567
2020-04-13 17:09:59.640,/xxx/xxxxxxxxxxxxxx/v1/xxx/generate,2020-04-13 17:09:59.624,2020-04-13 17:09:59.640
2020-04-13 17:09:59.796,/yyyy/defoe/v1/aaaaaaaaaal/,2020-04-13 17:09:59.523,2020-04-13 17:09:59.796
2020-04-13 17:09:59.780,/dcd/manual/v2/profile/, ,2020-04-16 09:59:59.740,2020-04-16 09:59:59.825

Есть несколько решений в stockoverflow, Решение отлично работает на всех линиях, кроме линий, похожих на последнюю.

Если вы заметили, что последняя строка немного отличается, она должна выглядеть следующим образом:

2020-04-13 17:09:59.780,/dcd/manual/v2/profile,2020-04-16 09:59:59.740,2020-04-16 09:59:59.825

Но вместо этого она выглядит следующим образом:

2020-04-13 17:09:59.780,/dcd/manual/v2/profile,billingAccountNo,faId,2020-04-16 09:59:59.740,2020-04-16 09:59:59.825

Другие решения, которые я получил в стеке потока ..

sed -E 's|/[0-9]+[^,]*,|/,|' or sed -E 's|/[0-9]{10}[^,]*,|/,|'
awk 'BEGIN{FS=OFS=","} {sub(/[0-9]{10}.*/,"",$2)} 1'

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Если вы просто хотите удалить 10-значный номер телефона в строке, то вы можете использовать [0-9] с повторением из 10, например (с BRE)

sed 's/[0-9]\{10\}//' file

или с ERE

sed -E 's/[0-9]{10}//' file

С небольшим изменением для замены вы можете удалить из 10-ди git номер телефона до конца:

sed 's/[0-9]\{10\}.*$//' file

Удалить телефон от следующего к последнему ','

Наконец, чтобы сохранить содержимое между двумя последними ',' после телефона, как указано в комментарии, вместо этого просто привязка к концу с помощью '$', вы просто создаете группу захвата из [^,]*,.*$, чтобы сохранить текст, а затем повторно вставляете захваченный текст с первой пронумерованной обратной ссылкой (\1), создающей вывод, который вы показываете в комментарии ниже.

sed 's/[0-9]\{10\}.*\(,[^,]*,.*$\)/\1/' file

(или с ERE)

sed -E 's/[0-9]{10}.*(,[^,]*,.*$)/\1/' file

Пример использования / Вывод

$ sed 's/[0-9]\{10\}.*\(,[^,]*,.*$\)/\1/' file
2020-04-13 17:09:58.934,/abc/blahblahblahI/v1/dennisritchie/,2020-04-13 17:09:58.687,2020-04-13 17:09:58.934

2020-04-13 17:09:59.387,/cde/bunnyrabbit/v1/tea/generate/,2020-04-13 17:09:59.322,2020-04-13 17:09:59.387

2020-04-13 17:09:59.567,/fgh/scoobybites/v1/shaggy/markup/,2020-04-13 17:09:59.459,2020-04-13 17:09:59.567

2020-04-13 17:09:59.640,/xxx/xxxxxxxxxxxxxx/v1/xxx/generate,2020-04-13 17:09:59.624,2020-04-13 17:09:59.640

2020-04-13 17:09:59.796,/yyyy/defoe/v1/aaaaaaaaaal/,2020-04-13 17:09:59.523,2020-04-13 17:09:59.796

2020-04-13 17:09:59.780,/dcd/manual/v2/profile/,2020-04-16 09:59:59.740,2020-04-16 09:59:59.825
0 голосов
/ 17 апреля 2020

Не могли бы вы попробовать следующее, это удалит все от номера телефона до последней запятой во 2-м поле.

awk '{sub(/[0-9]{10}.*,/,",",$2)} 1'  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...