Bash объединить строки файла - PullRequest
3 голосов
/ 24 марта 2020

У меня есть файл, содержащий выходные данные теста.

test 1  
42  
test 2  
69  
test 3  
420  
test 4  
55378008  

Я хотел бы, чтобы результаты теста отображались в той же строке, что и имя теста. вот так:

test 1:    42  
test 2:    69  
test 3:    420  
test 4:    55378008  

Я уверен, что есть какой-то причудливый sed, awk или perl способ сделать это, но я застрял.

Ответы [ 6 ]

5 голосов
/ 24 марта 2020

А вот еще один в стиле sed, чтобы завершить предложение:

sed 'N ; s/\n/: /' input_file

Для каждой (нечетной) строки, начиная с первой, добавьте следующую (четную) строку в шаблонном пространстве, разделенную LF затем просто замените этот LF на :.

3 голосов
/ 24 марта 2020

pr имеет эту встроенную функцию, но если вам также нужна корректировка пробелов, то sed/awk/perl решения, предложенные в других ответах, подойдут вам лучше

$ pr -2ats': ' ip.txt 
test 1: 42
test 2: 69
test 3: 420
test 4: 55378008

Это объединяет 2 строки за раз с : в качестве разделителя.

3 голосов
/ 24 марта 2020
awk 'FNR%2{printf "%s: ", $0; next}1' file

Это печатает нечетные строки с суффиксом : и без новой строки и четные строки с новой строкой.

2 голосов
/ 24 марта 2020

Просто замените перевод строки нечетных строк на :␠.

perl -pe's/\n/: / if $. % 2'

Вы упомянули, что вы также хотите удалить пробелы в начале и в конце. Для этого вы можете использовать следующее:

perl -pe's/^\h+|\h+$/g; s/\n/: / if $. % 2'

Указание файла для обработки Perl однострочный

1 голос
/ 24 марта 2020

Решение оболочки, которое составляет very slow для большого набора данных / файлов.

while IFS= read -r odd_line; do
  IFS= read -r even_line
  printf '%s: %s\n' "$odd_line" "$even_line"
done < file.txt

С другой стороны, если двоеточие не является обязательным paste может выполнить эту работу.

paste - - < file.txt
0 голосов
/ 24 марта 2020

Bash решение

пропускает пустые строки

обрабатывает оба формата UNIX / DOS «конец строки»

принимает имя файла в качестве аргумента или иначе читает данные из STDIN

#!/bin/bash

while read p1
do
  [[ -z $p1 ]] && continue
  # p1=`echo -n $p1 | tr -d "\r"`  # replaced with following line
  p1=${p1//$'\r'/}
  read p2
  echo -n "$p1: $p2"
done < ${1:-/dev/stdin}

Выход

test 1: 42
test 2: 69
test 3: 420
test 4: 55378008

ПРИМЕЧАНИЕ: пустые строки между строками для соединения не допускаются

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...