Рейтинг:1

Как удалить строку из каждой строки файла во втором столбце файла

флаг bt

Структура файла такая:

34945,/данные/файл/система01/данные/система/резервные копии/имя файла.txt
393092,/data/file/system-03stby/data/system/backups/filename.extra.txt

Результат, который я ищу, таков:

34945,/данные/система/резервные копии/имя файла.txt
393092,/данные/система/резервные копии/имя файла.extra.txt
флаг hr
Какое правило следует использовать для удаления строки? Должно ли это быть какое-то совпадение с шаблоном или определенное число или компоненты каталога?
donna_unsworthcomcastnet avatar
флаг bt
Всегда будут первые 3 каталога в пути, т.е. /data/file/system01 и первые 2 каталога будут одинаковыми, третий будет другим
Рейтинг:2
флаг hr

Данный

$кошачий файл
34945,/данные/файл/система01/данные/система/резервные копии/имя файла.txt
393092,/data/file/system-03stby/data/system/backups/filename.extra.txt

тогда

$ sed -E 's:,(/[^/]*){3}:,:' файл
34945,/данные/система/резервные копии/имя файла.txt
393092,/данные/система/резервные копии/имя файла.extra.txt

или аналогично

$ awk -F, 'BEGIN{OFS=FS} {sub(/([/][^/]*){3}/,"",$2)} 1' файл
34945,/данные/система/резервные копии/имя файла.txt
393092,/данные/система/резервные копии/имя файла.extra.txt

В любом случае, ([/][^/]*){3} представляет собой расширенное регулярное выражение, соответствующее косой черте, за которой следует ноль или более символов без косой черты, все 3 раза. Если первые два каталога постоянны, вы можете использовать что-то вроде sed 's:,/data/file/[^/]*:,:' или же awk -F, 'BEGIN{OFS=FS} {sub(/data[/]file[/][^/]*[/]/,"",$2)} 1'.

Или разбивается и объединяется в perl:

$ perl -F, -lpe '@p = split /\//, $F[1]; $_ = присоединить ",", $F[0], (присоединиться к "/", @p[4..$#p])' файл
34945,данные/система/резервные копии/имя файла.txt
393092,данные/система/резервные копии/имя файла.extra.txt
terdon avatar
флаг cn
Я думаю, вы могли бы просто использовать `sed -E 's:(/[^/]*){3}::'file`. Не надо запятой.
флаг hr
@terdon да, я действительно добавил это только для того, чтобы однозначно привязать его к началу второго поля.
terdon avatar
флаг cn
Хм, да, и это, вероятно, хорошая идея. ОП упоминал «второй столбец».
Рейтинг:1
флаг cn

Другой способ Perl, та же основная идея, что и ответ @steeldriver, но более кратко:

$ perl -F'[,/]' -nle 'распечатать файл "$F[0],/",join("/",@F[5..$#F])'
34945,/данные/система/резервные копии/имя файла.txt
393092,/данные/система/резервные копии/имя файла.extra.txt
Рейтинг:-1
флаг it

Читать мужская стрижка и использовать вырезать "-d", -f2- | вырезать -d/ -f5- в вашем файле.

terdon avatar
флаг cn
Это приведет к `data/system/backups/filename.txt`, а не `34945,/data/file/system01/data/system/backups/filename.txt`, как было запрошено. Кроме того, `,` не являются особыми, нет необходимости заключать в кавычки `"-d,"`.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.