У меня есть файл с 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
решение1
Попробуйте ниже.
$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
Предположим, что данные находятся в файле 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
С наилучшими пожеланиями... ура, drl
решение3
Вы ищете в правильном месте (awk или sed).
sed
достаточно, если используется gnu sed
.
видетьhttps://www.gnu.org/software/sed/manual/sed.html#Числовые-адреса
4.2 Выбор строк по номерам
…
first~step Это расширение GNU соответствует каждой строке stepth, начиная со строки first. В частности, строки будут выбраны, когда существует неотрицательное n, такое, что текущий номер строки равен first + (n * step). Таким образом, можно использовать 1~2 для выбора нечетных строк и 0~2 для четных строк; чтобы выбрать каждую третью строку, начиная со второй, нужно использовать '2~3'; чтобы выбрать каждую пятую строку, начиная с десятой, нужно использовать '10~5'; а '50~0' — это просто неясный способ сказать 50.
Следующие команды демонстрируют использование адреса шага:
$ seq 10 | sed -n '0~4p' 4 8
$ seq 10 | sed -n '1~3p' 1 4 7 10
решение4
Если в нечетных строках есть конечный пробел, вы можете написать скрипт 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
записать файл на диск и выйти.
Этот метод не добавляет пробелов между соседними строками, поэтому, если вам нужно добавить, скажем, табуляцию, то вам нужно будет вставить ее, добавив эту строку перед существующей printf
:
printf '%ds/$/ /\n' "$line"
где пробел, который вы видите в тексте замены, — это табуляция (введите ее с помощью Control-V, TAB).