Печать четных/нечетных строк в новый столбец

У меня есть файл с X строк в одном столбце, и я хочу напечатать каждую четную/нечетную строку в новый столбец, возможно ли это в Linux или vim редактор?

Например:

Входной файл:

RESOLUTION: 1.70
UNIT: MONOMERIC
RESOLUTION: 1.80
UNIT: DIMERIC
RESOLUTION: 2.50
UNIT: TRIMERIC
RESOLUTION: 2.20
UNIT: TETRAMERIC

Выходной файл, который мне нужен:

RESOLUTION: 1.70    UNIT: MONOMERIC
RESOLUTION: 1.80    UNIT: DIMERIC
RESOLUTION: 2.50    UNIT: TRIMERIC
RESOLUTION: 2.20    UNIT: TETRAMERIC
0
05.06.2019, 12:49
4 ответа

Предположим, что данные находятся в файле z1, тогда

paste -sd "\t\n" z1

произведет:

RESOLUTION: 1.70        UNIT: MONOMERIC
RESOLUTION: 1.80        UNIT: DIMERIC
RESOLUTION: 2.50        UNIT: TRIMERIC
RESOLUTION: 2.20        UNIT: TETRAMERIC

В системе типа:

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

С наилучшими пожеланиями... ура, дрл

2
28.01.2020, 02:30

Вы ищете в правильном месте (awk или sed ).

sedдостаточно, если используется gnu sed.

см.https://www.gnu.org/software/sed/manual/sed.html#Numeric-Addresses

4.2 Selecting lines by numbers

first~step This GNU extension matches every stepth line starting with line first. In particular, lines will be selected when there exists a non-negative n such that the current line-number equals first + (n * step). Thus, one would use 1~2 to select the odd-numbered lines and 0~2 for even-numbered lines; to pick every third line starting with the second, ‘2~3’ would be used; to pick every fifth line starting with the tenth, use ‘10~5’; and ‘50~0’ is just an obscure way of saying 50.

The following commands demonstrate the step address usage:

$ seq 10 | sed -n '0~4p' 4 8

$ seq 10 | sed -n '1~3p' 1 4 7 10

1
28.01.2020, 02:30

Попробуйте ниже.

$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
2
28.01.2020, 02:30

Если у вас есть конечный пробел в нечетных -пронумерованных строках, вы можете написать edскрипт:

{ for((line=1; line <= $(wc -l < input) / 2; line++)); do printf '%d,%dj\n' "$line" "$((line + 1))"; done; echo "wq"; } | ed -s input

Переформатировано:

{ for((line=1; line <= $(wc -l < input) / 2; line++))
  do 
    printf '%d,%dj\n' "$line" "$((line + 1))"
  done
  echo "wq"
} | ed -s input

Общая идея состоит в том, чтобы вычислить количество строк, разделить его на два, выполнить команды печати ed, которые будут соединять нечетные и четные -пронумерованные строки. Для вашего файла примера из восьми строк -цикл выдаст следующие edкоманды:

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

Последняя команда echoпросто говорит edзаписать файл на диск и выйти (exit ).

Этот метод не добавляет пробелов между соседними строками, поэтому, если вам нужно добавить (, скажем, )вкладку, вам нужно будет вставить ее, добавив эту строку перед существующейprintf:

        printf '%ds/$/  /\n' "$line"

где пробел, который вы видите в тексте замены, является вкладкой (введите его с помощью Control -V , TAB).

0
28.01.2020, 02:30

Теги

Похожие вопросы