#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
и дать мне знать тогда?