Вставить ‘ ‘ в каждое целое число, найденное в формате txt

#awk #sed

#awk #sed

Вопрос:

У меня огромное количество данных в следующем формате, и я хочу вставить » » в каждое найденное число.

Ввод:

    202, "Pen"  ,
   203, "Unassigned"  ,
   204, "Pencil"  ,
   205, "Scissor"  ,
   206, "Mouse"  ,
   207, "Unassigned"  ,
   208, "Laptopn"  ,
   209, "Unassigned"  ,
   210, "Unassigned"  ,
 

Ожидаемый результат:

    '202', "Pen"  ,
   '203', "Unassigned"  ,
   '204', "Pencil"  ,
   '205', "Scissor"  ,
   '206', "Mouse"  ,
   '207', "Unassigned"  ,
   '208', "Laptopn"  ,
   '209', "Unassigned"  ,
   '210', "Unassigned"  ,
 

Что я делаю, так это следующее:

 awk   ' { for ( i = 1; i <= NF;   i ) {
    if ( $i == int )
        r = 1        
  }
}1 ' example.txt > example2.txt
 

Комментарии:

1. Пожалуйста, добавьте свои усилия в свой вопрос, что настоятельно рекомендуется в SO (кстати, не мой downvote).

2. Я новичок в этом, спасибо за ваш комментарий кстати @RavinderSingh13

3. Ваш код не проверяет, является ли поле целым числом; он проверяет, равно ли оно необъявленной переменной int (поэтому эффективно проверяет, равно ли оно пустой строке или нулю).

4. Я считаю, что этот вопрос следует повторно открыть, поскольку OP добавил усилия, о которых идет речь.

Ответ №1:

Не могли бы вы, пожалуйста, попробовать следовать, написанным и протестированным точно на основе показанных вами примеров в GNU awk .

 awk '
($1~/^[0-9] ,$/){
   $1="47"$1
   sub(/,$/,"47amp;",$1)
}
1
' Input_file
 

ИЛИ, если у вас есть несколько полей, где вам нужно преобразовать все поля, начиная с цифр, обернутых ' затем, попробуйте следующее.

 awk '
{
  for(i=1;i<=NF;i  ){
    if($i~/^[0-9] ,$/){
      $i="47"$i
      sub(/,$/,"47amp;",$i)
    }
  }
}
1
' Input_file
 

Объяснение: добавление подробного объяснения выше. Объяснение для 1-го и 2-го решения одинаковое, единственное различие между этими 2: 1-е относится к 1-му полю с точки зрения подстановки, а 2-е решение проходит через все поля для выполнения подстановки.

 awk '                         ##Starting awk program from here.
{
  for(i=1;i<=NF;i  ){         ##Traversing through all fields of current line here.
    if($i~/^[0-9] ,$/){       ##Checking condition if current field starts from digits(continously) and ends with a comma then do following.
      $i="47"$i             ##Adding single quote before current field then.
      sub(/,$/,"47amp;",$i)    ##Substituting comma(comint at last of field) with single quote and comma in current field.
    }
  }
}
1                             ##1 will print current line here.
' Input_file                  ##Mentioning Input_file name here.
 

Комментарии:

1. Отлично! Это работает, как и ожидалось, не могли бы вы немного объяснить?

2. @Luka, теперь добавили подробное объяснение решений, приветствия.

3. @Luka, также я надеюсь, что ваш фактический Input_file совпадает с показанными примерами, где запятая идет после цифр, потому что мои решения имеют дело с этим, позвольте мне сейчас, если есть какие-либо вопросы здесь.

4. Еще один вопрос, который я забыл, как я мог изменить первую запятую в поле ecah на «‘:»‘, чтобы получить ‘202’: «Ручка», ‘203’: «Неназначенный» ,

5. @Luka, просто измените sub(/,$/,"47amp;",$1) НА sub(/,$/,"47:",$1) в первом решении и измените с sub(/,$/,"47amp;",$i) НА sub(/,$/,"47:",$i) в приведенных выше решениях, и у нас все должно быть готово.