Пробудить, разделить и напечатать ряд столбцов - PullRequest
0 голосов
/ 01 февраля 2020

Я хотел бы создать новый файл с выбранными столбцами из существующего файла. Я хочу выбрать строки на основе «X», а затем напечатать столбцы 1, 2, 4 и 5 как есть. Затем я хочу разделить столбцы 10 до последнего столбца (50) на основе разделителя «:» и извлечь только первую часть каждого из этих столбцов.

Пример: столбцы с 10 по 50 выглядят как -> 10:a:b:c:d:e:f (мне нужно только '10' для каждого из этих столбцов).

Пока у меня есть следующее, но я не знаю, как сделать диапазон столбцов для разделения и напечатать часть [1], поэтому здесь у меня есть только столбец 10, но я хочу, чтобы он делал то же самое вплоть до столбца 50.

пример ввод:

X 2 3 4 5 6 7 8 9 10:a:b:c 11:d:e:f 12:g:h:i (all the way to 50)

пример вывода:

X 2 4 5 10 11 12 (all the way to 50)

код:

awk '$1 == "X" {print $1, $2, $4, $5, split($10,a,":"), a[1]}' file.txt > test.txt

1 Ответ

1 голос
/ 01 февраля 2020

Я думаю, я бы go об этом немного по-другому. Вместо того, чтобы захватывать первое подполе «:» в полях с 10 по 50 в массиве, я бы просто переписал эти поля in situ.

$1 == "X" {
  $3=""
  for (i=6; i<=9; i++)
    $i=""
  for (i=10; i<=NF; i++)
    $i=substr($i,0,index($i,":")-1)
  print
}

Обработка $3 здесь немного слабовата ; У awk нет реального решения для удаления столбца. Если вы не можете обработать дополнительные разделители, то может потребоваться более подробное описание:

$1 == "X" {
  s=""
  for (i=10; i<=NF; i++)
    s=s OFS substr($i,0,index($i,":")-1)
  print $1,$2,$4,$5 s
}

В этом решении пропущена запятая перед окончательным s, поскольку OFS будет включен в качестве первого символа из этой строки. Это l̶a ,z unnei̶n̶e̶s̶s̶ оптимизация, чтобы избежать ненужных тестов, но вы также можете изменить это, чтобы избежать временной переменной, если вам нравится:

$1 == "X" {
  printf "%s", $1 OFS $2 OFS $4 OFS $5
  for (i=10; i<=NF; i++)
    printf "%s", OFS substr($i,0,index($i,":")-1)
  printf ORS
}

Мы используем printf здесь, чтобы избежать ложных случаев ORS .

Я тестировал так:

$ cat input
X 2 3 4 5 6 7 8 9 10:a:b 11:c:d 12:e:f:g
$ awk -f test.awk input
X 2 4 5 10 11 12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...