использование awk для выполнения операции со вторым значением, только в строках с определенной строкой

#awk

#awk

Вопрос:

ОК. у меня есть это, которое работает. ура!

 awk '/string/ { print $0 }' file1.csv | awk '$2=$2 (int(rand()*10))' > file2.csv
  

но я хочу, чтобы контекст моего файла также печатался в file2.csv. эта программа печатает только строки, содержащие мою строку, что хорошо, это начало.

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

итак, я хочу, чтобы исходное содержимое (file1.csv) оставалось нетронутым с единственной разницей, заключающейся в скорректированном значении в 2 доллара в строках, соответствующих моей строке.

кто-нибудь может мне помочь? Спасибо.

И вот 4 строки из исходного csv:

 2, 0, Control, 0, 7, 1000  
2, 0, Control, 0, 10, 540  
2, 30720, String, 0, 76, 100  
2, 32620, String, 0, 76, 0
  

Ожидаемый результат тот же, за исключением небольших изменений до 2 долларов:

 2, 0, Control, 0, 7, 1000  
2, 0, Control, 0, 10, 540  
2, 30725, String, 0, 76, 100  
2, 32621, String, 0, 76, 0
  

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

1. Хорошим началом было бы показать несколько проверяемых строк из file1.csv и ожидаемый результат.

2. надеюсь, это поможет @JamesBrown

Ответ №1:

 $ awk 'BEGIN{FS=OFS=", "} /String/{$2 =int(rand()*10)}1' file

2, 0, Control, 0, 7, 1000
2, 0, Control, 0, 10, 540
2, 30722, String, 0, 76, 100
2, 32622, String, 0, 76, 0
  

вероятно, вам также нужно инициализировать начальное значение rand в блоке BEGIN, иначе вы всегда будете получать одну и ту же последовательность rand.

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

1. Спасибо. просто осознаю это также. прямо сейчас я использую: awk -v rnd1=$((RANDOM)) '$3 ~ /String/ { $2=$2 (srand(rnd1)) } { print $0 }' test.csv

2. как вы сохраняете запятую неповрежденной?

3. установите OFS таким же, как FS; проверьте блок BEGIN.

Ответ №2:

Что-то вроде этого, может быть:

 $ awk -F", " -v OFS=", " '$3 ~ /String/ { $2=$2 (int(rand()*10))} { print $0 }' file1.csv
2, 0, Control, 0, 7, 1000  
2, 0, Control, 0, 10, 540  
2, 30722, String, 0, 76, 100  
2, 32622, String, 0, 76, 0
  

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

1. извините. при ближайшем рассмотрении это работает не так, как мне нужно. это удаляет запятые из строк и добавляет денежный символ к другим.

2. Моя ошибка, исправлено.