Разделение первого столбца файла на несколько столбцов с помощью AWK - PullRequest
0 голосов
/ 15 января 2019

Файл выглядит так, но с миллионами строк (TAB разделены):

1_number_column_ranking_+   100 200 Target "Hello" 

Я хочу разделить первый столбец на _, чтобы он стал:

1 number column ranking + 100 200 Target "Hello"

Это код, который я пробовал:

awk -F"\t" '{n=split($1,a,"_");for (i=1;i<=n;i++) print $1"\t"a[i]}' 

Но это не совсем то, что мне нужно.
Любая помощь приветствуется (другие темы на эту тему не были полезны для меня).

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Еще один awk, если «_» появляется только в первом столбце. Разбейте поле ввода с помощью регулярного выражения "[_ \ t] +" и просто сделайте фиктивную операцию, например, $ 1 = $ 1, в главном разделе, чтобы реконструировать $ 0 с OFS = "\ t"

$ cat steveman.txt
1_number_column_ranking_+       100     200i    Target  "Hello"

$ awk -F"[_\t]" ' BEGIN { OFS="\t"} { $1=$1; print } ' steveman.txt
1       number  column  ranking +       100     200i    Target  "Hello"

$

Спасибо @Ed, обновлено с -F"[_\t]+" до -F"[_\t]", что позволит избежать объединения пустых полей.

0 голосов
/ 15 января 2019

Нет необходимости разбивать, просто заменить будет:

awk 'BEGIN{FS=OFS="\t"}{gsub("_","\t",$1)}1'

Например:

$ cat file
1_number_column_ranking_+       100     200     Target "Hello"

$ awk 'BEGIN{FS=OFS="\t"}{gsub("_","\t",$1)}1' file
1       number  column  ranking +       100     200     Target "Hello"

gsub заменит все вхождения, если не указан третий аргумент, он заменит $ 0.
Последний 1 является ярлыком для {print}. (всегда true, подразумевается {print}.)

...