Copie a coluna com o nome do arquivo como cabeçalho da coluna

2

Eu queria organizar meu conjunto de dados copiando a coluna de um número de arquivo de texto e acrescentar o nome do arquivo na primeira linha dos novos arquivos. Aqui está uma amostra dos meus dados

arquivo1

a   a   b   b
1   2   3   4

arquivo2

c   d   e   f
g   h   i   g

. .

arquivo3

11  12  23  12
2   4   6   7

filen

n1  n2  n3  n4
nn  nm  no  np

minha saída desejada é produzir 4 arquivos de dados coletando as respectivas colunas do arquivo de dados.

Output1

file1   file2   file3   filen
a   c   11  n1
1   g   2   nn

Output2

file1   file2   file3   filen
a   d   12  n2
2   h   4   nm

Output3

file1   file2   file3   filen
b   e   23  n3
3   i   6   no

Output4

file1   file2   file3   filen
b   f   12  n4
4   g   7   np

Consegui copiar e organizar os quatro arquivos desejados usando

awk 'FNR==1{f++}{a[f,FNR]=$1}END{for(x=1;x<=FNR;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' file* > output1
awk 'FNR==1{f++}{a[f,FNR]=$2}END{for(x=1;x<=FNR;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' file* > output2
awk 'FNR==1{f++}{a[f,FNR]=$3}END{for(x=1;x<=FNR;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' file* > output3
awk 'FNR==1{f++}{a[f,FNR]=$4}END{for(x=1;x<=FNR;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' file* > output4

No entanto, não consegui anexar o nome do arquivo na primeira linha dos arquivos de saída.

Qualquer ajuda seria apreciada

    
por AiB 20.02.2016 / 00:08

3 respostas

1

Se você já tem os arquivos de saída e só precisa adicionar um cabeçalho com os nomes dos arquivos para cada um deles, tudo que você precisa é algo como:

header=$(printf "%s %s %s %s\n" $(awk 'FNR==1{print FILENAME}' file*))
for file in output*; do 
    printf '%s\n%s\n' "$header" "$(cat $file)" > tmp && 
    mv tmp "$file"; 
done
    
por 20.02.2016 / 00:52
0

Simplesmente faça o eco do arquivo e use os dados awk -processed:

paste <( echo file1 ; awk '{print $1}' file1 )\
      <( echo file2 ; awk '{print $1}' file2 ) #and so on

Os comandos entre parênteses são executados em seus próprios subshells antes de serem passados como entrada para paste

    
por 20.02.2016 / 00:19
0

Eu faria a coisa toda assim:
Use printf + cut para imprimir o cabeçalho, paste do conteúdo dos arquivos e con cat enate os dois resultados, em seguida canalize para awk e imprima cada quarta coluna começando com 1st one para output1 , cada quarta coluna começando com 2nd one para output2 e assim por diante:

for f in file*
do
printf " ${f}%.0s" 1 2 3 4
done | cut -c2- | cat - <(paste file*) | awk '{
for (i=1;i<=NF;i+=4){printf "%s ",$i >"output1"} ;print "" >"output1"
for (i=2;i<=NF;i+=4){printf "%s ",$i >"output2"} ;print "" >"output2"
for (i=3;i<=NF;i+=4){printf "%s ",$i >"output3"} ;print "" >"output3"
for (i=4;i<=NF;i+=4){printf "%s ",$i >"output4"} ;print "" >"output4"
}'
    
por 20.02.2016 / 13:42