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
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.
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
Tags text-processing