цикл awk с большим количеством экземпляров и пробелов

#awk

#awk

Вопрос:

это мой текст:

 haeasdf apple sdfgsdg 
asdfa orange sdfg sfgs
sdfg s apple sgdfgsg
sg sdfg orange sfgsfg 
sdfg orange sgsfgsdg
...
  

поэтому я использую awk для замены текста на

 awk {for(i=1;i<=NF;i  ){if($i~/apple/){sub(/apple/,"apple   count",$i)}}} 1;


haeasdf apple1 sdfgsdg 
asdfa orange sdfg sfgs
sdfg s apple2 sgdfgsg
sg sdfg orange sfgsfg 
sdfg orange sgsfgsdg
...
  

Должен ли я запускать еще раз orange , поскольку мне не удалось объединить, тогда, если изменить i , чтобы j сделать это так {for(i=1;i<=NF;i ){if($i~/apple/){sub(/apple/,"apple count",$i)}}} 1; {for(j=1;j<=NF;j ){if($j~/orange/){sub(/orange/,"orange count",$j)}}} 1;

[2] Я обнаружил, что не могу использовать эту команду awk {for(i=1;i<=NF;i ){if($i~/apple[[:space:]]banana/){sub(/apple[[:space:]]banana/,"apple count",$i)}}} 1; или awk {for(i=1;i<=NF;i ){if($i~/apple banana/){sub(/apple banana/,"apple count",$i)}}} 1; если есть пробел

 some words here apple banana some words here 
some words here orange some words here
some words here apple banana some words here
some words here orange some words here
some words here orange some words here
...
  

Я хотел заменить apple banana на быть apple . Итак, вывод, как показано ниже

 some words here apple1 some words here 
some words here orange some words here
some words here apple2 some words here
some words here orange some words here
some words here orange some words here
...
  

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

1. не уверен, правильно ли я понял ваш вопрос, awk '{print $0, a[$0]}' file решает ли ваша проблема?

2. @Sundeep спасибо, извините, я неправильно задал этот вопрос.

3. @olo, так oragne что, если вы также хотите сделать это как orange1,oragne2 и так далее … не могли бы вы подтвердить то же самое один раз?

4. @RavinderSingh13 да, я бы тоже хотел, чтобы оранжевый был orange1,oragne2...

Ответ №1:

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

 awk -v str="apple,orange" '
BEGIN{
  num=split(str,arr,",")
  for(i=1;i<=num;i  ){
    numFound[arr[i]]
  }
}
{
  for(i=1;i<=NF;i  ){
    if($i in numFound){ $i=$i ""   count[$i] }
  }
}
1' Input_file
  

Однострочная форма решения в соответствии с потребностями OP в комментариях:

awk -v str="apple,orange" 'BEGIN{num=split(str,arr,",");for(i=1;i<=num;i ){numFound[arr[i]]}} {for(i=1;i<=NF;i ){if($i in numFound){$i=$i "" count[$i]}}}1' Input_file



EDIT1: в соответствии со 2-м примером OP попробуйте выполнить следующее.

 awk -v str="apple,orange" '
BEGIN{
  num=split(str,arr,",")
  for(i=1;i<=num;i  ){
    numFound[arr[i]]
  }
}
{
  gsub(/apple banana/,"apple")
  for(i=1;i<=NF;i  ){
    if($i in numFound){ $i=$i ""   count[$i] }
  }
}
1
' Input_file
  

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

1. Спасибо за ответ, однако, имея syntax error

2. @olo, это отлично сработало для меня и хорошо протестировало его, не могли бы вы, пожалуйста, дважды проверить правильность его копирования (я только что перезапустил его), и с ним все в порядке, пожалуйста, повторно запустите его, скопировав его снова, и дайте мне знать, приветствия.

3. все еще возникают ошибки. даже преобразовал его в одну строку awk -v str="apple,orange" 'BEGIN{num=split(str,arr,",") for(i=1;i<=num;i ){numFound[arr[i]] } } {for(i=1;i<=NF;i ){if($i in numFound){ $i=$i "" count[$i] } } } 1' inFile

4. @olo, в одной строке попробуйте awk -v str="apple,orange" 'BEGIN{num=split(str,arr,",");for(i=1;i<=num;i ){numFound[arr[i]]}} {for(i=1;i<=NF;i ){if($i in numFound){$i=$i "" count[$i]}}}1' Input_file и дайте мне знать тогда?

5. @olo, не могли бы вы попробовать следовать awk -v str="apple,orange" 'BEGIN{num=split(str,arr,",");for(i=1;i<=num;i ){numFound[arr[i]]}} {gsub(/apple banana/,"apple");for(i=1;i<=NF;i ){if($i in numFound){$i=$i "" count[$i]}}}1' Input_file и дать мне знать тогда?