Замена значения столбца на конкретное для разных значений

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

то есть мой файл выглядит так:

test.dat

 5   500  Mruh
 6   100  Mrah 
 15  1.77 Mta
 .
 .
 .

и т. д. В идеале я хотел бы выбрать значение, скажем, 6 (которое равно 100) и увеличить его на 50, чтобы затем для каждого увеличения был новый файл. Таким образом, конечным продуктом должен быть новый файл, который выглядит так:

test_50.dat

5   500   Mruh
6   150   Mrah
15  1.77  Mta

Я пытался использовать команду awk, но столкнулся с проблемами. Любая помощь будет отличной.

Ваше здоровье!


person domsmiff    schedule 23.01.2014    source источник
comment
С какими проблемами вы столкнулись? Покажите код, чтобы мы могли попытаться дать рекомендации. Кроме того, следует ли задавать параметр 6, а затем всегда увеличивать его на 50 (фиксированное)?   -  person fedorqui 'SO stop harming'    schedule 23.01.2014


Ответы (1)


Это awk должно делать:

awk '$1==6 {sub($2,$2+50)}1' file >test_50.dat
cat test_50.dat     
5   500  Mruh
6   150  Mrah
15  1.77 Mta

Найдите строки с 6, а затем добавьте 50 в столбец #2
Я использую sub, чтобы сохранить форматирование, как вы видите здесь:

awk '$1==6 {$2+=50}1' file >test_50.dat
cat test_50.dat
 5   500  Mruh
6 150 Mrah
 15  1.77 Mta

Чтобы получить его в файл на основе значения 50

awk '$1==6 {sub($2,$2+v)} {print $0 > "test_"v".dat"}' v=50 file
cat test_50.dat
 5   500  Mruh
 6   150  Mrah
 15  1.77 Mta
person Jotne    schedule 23.01.2014
comment
sub() не сохраняет формат. и более того, это опасно. потому что он соответствует regex. подумайте о 2-й строке 6 6 Mrah, ваш sub() заменит 1-й столбец. так что решение + является правильным. если кто-то хочет иметь определенный формат, используйте printf и т. д. позже. - person Kent; 23.01.2014
comment
Если вы хотите сохранить форматирование, вы также можете использовать функцию split() в Gnu Awk версии 4. У нее есть четвертый аргумент, который является разделителем между полями. - person Håkon Hægland; 23.01.2014
comment
@kent Так как же тогда сохранить формат, используя awk 3x (по умолчанию в большинстве Ubuntu)? - person Jotne; 23.01.2014
comment
@Jotne printf или внешний инструмент, например столбец. sub() не следует использовать в этой ситуации. Например. 650 50 XXX если $1==650{sub(..)} вы поняли, что я имел в виду. ваш второй блок кода в ответе правильный. - person Kent; 23.01.2014