awk изменить один столбец в файле, где столбец меняет положение в разных файлах - PullRequest
0 голосов
/ 07 сентября 2018

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

поэтому file1 будет:

moo 100.35  blah  9  85 0.0038
moo 93.8    bluu 10  85 0.0042

и file2 будет:

125.2  129.3 moo 0.23
123.5  125.3 moo 0.23

и я хотел бы изменить его на:

1_horatio 100.35  blah  9  85 0.0038
2_horatio 93.8    bluu 10  85 0.0042

и

125.2  129.3 1_clarence 0.23
123.5  125.3 2_clarence 0.23

где число в новом имени для moo увеличивается для каждой строки. Имя является входной переменной.

вот что я пытался до сих пор:

newnam=$1
awk -v nnam=$newnam 'BEGIN{ count=1 }  {imgn=count"_"nam; print imgn,$2,$3,$4 count++  }' $2 > $3

который мне нужно изменить на:

newnam=$1
awk -v nam=$newnam 'BEGIN{ count=1 }  {imgn=count"_"nam; print $1,$2,imgn,$4 count++  }' $2 > $3

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

Есть ли способ сделать это в awk? Или bash с awk?

1 Ответ

0 голосов
/ 07 сентября 2018

Я думаю, что вы можете сделать что-то вроде этого,

awk '{$col=count"_"name; count++}1' name="clarence" col=3 <file>

Здесь мы используем следующие функции awk:

  • переопределение поля $n переопределит$0
  • Команда 1 означает {print $0}
  • Оператор $expr возвращает номер поля, заданный expr

Обновление: , чтобы счетчик начинался с 1, можно переписать это как:

awk '{count++; $col=count"_"name}1' name="clarence" col=3 <file>

, которое можно сократить как:

awk '{$col=++count"_"name}1' name="clarence" col=3 <file>

из-за использованияоператор предварительного увеличения ++var.Но опять же, теперь count напоминает только количество записей, таким образом

awk '{$col=NR"_"name}1' name="clarence" col=3 <file>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...