Eu tenho um arquivo com um número X de linhas em uma única coluna e quero imprimir todas as linhas pares/ímpares em uma nova coluna. Isso é possível no Linux ou no vim
editor?
Por exemplo:
Arquivo de entrada:
RESOLUTION: 1.70
UNIT: MONOMERIC
RESOLUTION: 1.80
UNIT: DIMERIC
RESOLUTION: 2.50
UNIT: TRIMERIC
RESOLUTION: 2.20
UNIT: TETRAMERIC
Arquivo de saída, que eu preciso:
RESOLUTION: 1.70 UNIT: MONOMERIC
RESOLUTION: 1.80 UNIT: DIMERIC
RESOLUTION: 2.50 UNIT: TRIMERIC
RESOLUTION: 2.20 UNIT: TETRAMERIC
Responder1
Experimente abaixo.
$cat a.txt
RESOLUTION: 1.70
UNIT: MONOMERIC
RESOLUTION: 1.80
UNIT: DIMERIC
RESOLUTION: 2.50
UNIT: TRIMERIC
RESOLUTION: 2.20
UNIT: TETRAMERIC
$ cat a.txt | sed 'N;s/\n/ /g'
RESOLUTION: 1.70 UNIT: MONOMERIC
RESOLUTION: 1.80 UNIT: DIMERIC
RESOLUTION: 2.50 UNIT: TRIMERIC
RESOLUTION: 2.20 UNIT: TETRAMERIC
Responder2
Supondo que os dados estejam no arquivo z1, então
paste -sd "\t\n" z1
vai produzir:
RESOLUTION: 1.70 UNIT: MONOMERIC
RESOLUTION: 1.80 UNIT: DIMERIC
RESOLUTION: 2.50 UNIT: TRIMERIC
RESOLUTION: 2.20 UNIT: TETRAMERIC
Em um sistema como:
OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution : Debian 8.11 (jessie)
bash GNU bash 4.3.30
paste (GNU coreutils) 8.23
Muitas felicidades... felicidades, drl
Responder3
Você está procurando no lugar correto (awk ou sed).
sed
é suficiente, se estiver usando gnu sed
.
verhttps://www.gnu.org/software/sed/manual/sed.html#Numeric-Addresses
4.2 Selecionando linhas por números
…
first~step Esta extensão GNU corresponde a cada linha stepth começando com a primeira linha. Em particular, as linhas serão selecionadas quando existir um n não negativo tal que o número da linha atual seja igual ao primeiro + (n * passo). Assim, usar-se-ia 1~2 para selecionar as linhas ímpares e 0~2 para as linhas pares; para escolher cada terceira linha começando pela segunda, '2~3' seria usado; para escolher cada quinta linha começando pela décima, use '10~5'; e '50~0' é apenas uma maneira obscura de dizer 50.
Os comandos a seguir demonstram o uso do endereço da etapa:
$ sequência 10 | sed -n '0~4p' 4 8
$ sequência 10 | sed -n '1 ~ 3p' 1 4 7 10
Responder4
Se você tiver um espaço à direita nas linhas ímpares, poderá escrever um ed
script:
{ for((line=1; line <= $(wc -l < input) / 2; line++)); do printf '%d,%dj\n' "$line" "$((line + 1))"; done; echo "wq"; } | ed -s input
Reformatado:
{ for((line=1; line <= $(wc -l < input) / 2; line++))
do
printf '%d,%dj\n' "$line" "$((line + 1))"
done
echo "wq"
} | ed -s input
A idéia geral é calcular o número de linhas, dividi-lo por dois, os ed
comandos de impressão que irão unir as linhas pares e ímpares. Para o seu arquivo de amostra de oito linhas, o loop produziria estes ed
comandos:
1,2j
2,3j
3,4j
4,5j
O comando final echo
simplesmente diz ed
para gravar o arquivo no disco e sair (sair).
Este método não adiciona nenhum espaço em branco entre as linhas adjacentes, portanto, se você precisar adicionar (digamos) uma guia, será necessário inseri-la adicionando esta linha antes da existente printf
:
printf '%ds/$/ /\n' "$line"
onde o espaço em branco que você vê no texto de substituição é uma tabulação (insira-a com Control-V, TAB).