Используйте sed (или подобный), чтобы удалить что-нибудь между повторяющимися образцами - PullRequest
3 голосов
/ 16 апреля 2020

Я пытаюсь "привести в порядок" много данных в CSV. Мне не нужна никакая информация, которая есть в "кавычках".

Пробовал sed 's/".*"/""/', но он удаляет запятые, если есть более одного раздела вместе.

Я хотел бы получить от это:

1,2,"a",4,"b","c",5

На это:

1,2,,4,,,5

Есть ли волшебник sed, который может помочь? :)

Ответы [ 3 ]

3 голосов
/ 16 апреля 2020

Вы можете использовать

sed 's/"[^"]*"//g' file > newfile

См. онлайн sed демо :

s='1,2,"a",4,"b","c",5'
sed 's/"[^"]*"//g' <<< "$s"
# => 1,2,,4,,,5

Подробности

Шаблон "[^"]*" соответствует ", затем 0 или более символов, отличных от ", а затем ". Матчи удалены, так как RHS пуст. Флаг g сопоставляет все вхождения в каждой строке.

2 голосов
/ 16 апреля 2020

С Perl:

perl -p -e 's/".*?"//g' file

? заставляет * быть не жадным.

Выход:

1,2,,4,,,5
2 голосов
/ 16 апреля 2020

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

awk -v s1="\"" 'BEGIN{FS=OFS=","} {for(i=1;i<=NF;i++){if($i~s1){$i=""}}} 1' Input_file

Не один вкладыш формы решения:

awk -v s1="\"" '
BEGIN{
  FS=OFS=","
}
{
  for(i=1;i<=NF;i++){
    if($i~s1){
      $i=""
    }
  }
}
1
'  Input_file

Подробное объяснение:

awk -v s1="\"" '         ##Starting awk program from here and mentioning variable s1 whose value is "
BEGIN{                   ##Starting BEGIN section of this code here.
  FS=OFS=","             ##Setting field separator and output field separator as comma(,) here.
}
{
  for(i=1;i<=NF;i++){    ##Starting a for loop which traverse through all fields of current line.
    if($i~s1){           ##Checking if current field has " in it if yes then do following.
      $i=""              ##Nullifying current field value here.
    }
  }
}
1                        ##Mentioning 1 will print edited/non-edited line here.
'  Input_file            ##Mentioning Input_file name here.
...