Imprimir linhas pares/ímpares na nova coluna

Imprimir linhas pares/ímpares na nova coluna

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 vimeditor?

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 edscript:

{ 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 edcomandos 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 edcomandos:

1,2j
2,3j
3,4j
4,5j

O comando final echosimplesmente diz edpara 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).

informação relacionada