Empilhe várias colunas

1

Eu gostaria de alterar um arquivo para que a coluna N + 1 fosse colocada no final da coluna N para cada N = número ímpar. Por exemplo, se eu tivesse um arquivo com 4 colunas, a coluna 2 seria colada no final da coluna 1 e a coluna 4 no final da coluna 3.

Arquivo de exemplo:

1 2 3 4
1 2 3 4
1 2 3 4

Arquivo de saída:

1 3
1 3
1 3
2 4
2 4
2 4

Meus arquivos têm ~ 100 linhas e ~ 60000 colunas.

    
por user283771 01.04.2018 / 10:53

2 respostas

0

Com bash:

#!/bin/bash

for c in 0 1; do
  while read -r -a columns; do
    for((i=$c; i<${#columns[@]}; i+=2)); do
      echo -n "${columns[$i]} "
    done
    echo
  done < file
done

Saída:

1 3 
1 3 
1 3 
2 4 
2 4 
2 4 
    
por 01.04.2018 / 12:32
0

Aqui está um pouco estranho enigmático:

awk '{for (i=1; i<=NF; i+=2) {printf "%s ", $(i + (NR > FNR))}; print ""}' file file

Na primeira vez que você processar o arquivo, NR > FNR será falso ou 0.
Na segunda vez que você processar o arquivo, NR > FNR será verdadeiro ou 1.

Este requer uma única passagem pelo arquivo, mas você precisa manter metade do arquivo na memória:

awk '
    {
        for (i=1; i<NF; i+=2) {
            printf "%s ", $i
            row[NR] = row[NR] $(i+1) " "
        }
        print ""
    }
    END {
        for (i=1; i<=NR; i++) print row[i]
    }
' file
    
por 01.04.2018 / 14:29