Использовать строку 1 столбца ith как имя выходного файла awk - PullRequest
0 голосов
/ 13 ноября 2018

Я очень недавний пользователь командной строки, поэтому мне требуется некоторая помощь, чтобы разбить текстовый файл по столбцам с помощью awk. Трудность для меня заключается в том, что я хочу, чтобы i-е имя файла было текстом из 1-й строки i-го столбца.

Вот что я имел в виду:

awk '{for(i = 2; i <= NF; i++){name= ??FNR == 1 $i?? ;print $1, $i > name}}' myfile.txt

Но я не знаю, как установить переменную имени ...

Ввод: myfile.txt

'ID'    'sample_1' 'sample_2' ...
'id_1'      1            2    ...
'id_2'      2            3    ...

Ожидаемый результат:

sample_1.txt:

'ID'    'sample_1'
'id_1'      1      
'id_2'      2  

sample_2.txt:

'ID'    'sample_2'
'id_1'      2      
'id_2'      3 

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вы можете попробовать это awk:

awk -F'\t' '                              # tab as field separator
{
  for ( i = 2 ; i <= NF ; i++ ) {         # for each record loop from field 2 to last field
    if ( NR == 1 ) {                      # if first record
      a[i] = $i                           # keep each field in array a
      gsub ( /^'\''|'\''$/ , "" , a[i] )  # remove quote at start and end in array a
      }
    print $1 FS $i > a[i]".txt"           # print needed field in corresponding file
  }
}' myfile.txt
0 голосов
/ 13 ноября 2018

Вы должны хранить заголовки столбцов в массиве.

awk 'NR==1 {
    for (i=2; i<=NF; ++i) {
        fnames[i] = gensub(/\x27/, "", "g", $i) 
        print $1, $i > fnames[i] ".txt"
    }
    next
}
{
    for (i=2; i<=NF; ++i)
        print $1, "\x27" $i "\x27" > fnames[i] ".txt"
}' myfile.txt
  • \x27 - одинарная кавычка в гекс-экранированном виде
  • gensub(/\x27/, "", "g", $i) удаляет одинарные кавычки из заголовков столбцов для именования выходных файлов, как вы хотели.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...