Как объединить текст алфавитных строк с числовыми строками в оболочке?

Первый шаг был бы к использованию памяти монитора. top может сделать это, но версия Linux неуклюжа для установки. Сделайте копию top исполняемый файл называют top-mem-chris. Выполните его и установите некоторые разумные параметры, по крайней мере, вид использованием памяти (M) и отобразите только первые задачи N (n 15). Затем имейте его, генерируют конфигурационный файл (W) ~/.top-mem-chrisrc. Для контроля, выполненный top-mem-chris -b -d 5 >~/log/top-mem-mainserver.log. С другой стороны, возможно, попробуйте atsar, который выглядит подходящим, но я не знаю вне описания.

10
05.05.2015, 18:29
7 ответов

Один способ использовать perl:

Содержание script.pl:

use warnings;
use strict;

## Check arguments.
die qq[Usage: perl $0 <input-file>\n] unless @ARGV == 1;

my (@alpha, @digit);

while ( <> ) {
        ## Omit blank lines.
        next if m/\A\s*\Z/;

        ## Remove leading and trailing spaces.
        s/\A\s*//;
        s/\s*\Z//;

        ## Save alphanumeric fields and fields with
        ## only digits to different arrays.
        if ( m/\A[[:alpha:]]+\Z/ ) {
                push @alpha, $_;
        }
        elsif ( m/\A[[:digit:]]+\Z/ ) {
                push @digit, $_;
        }
}

## Get same positions from both arrays and print them
## in the same line.
for my $i ( 0 .. $#alpha ) {
        printf qq[%s %s\n], $alpha[ $i ], $digit[ $i ];
}

Содержание infile:

AAAA
BBBB
CCCC
DDDD

1234
5678
9012
3456

EEEE 

7890

Выполните его как:

perl script.pl infile

И результат:

AAAA 1234
BBBB 5678
CCCC 9012
DDDD 3456
EEEE 7890
3
27.01.2020, 20:01
  • 1
    Интересный... Ваши две regex строки замены, которые Удаляют продвижение и конечные пробелы, выполненные приблизительно в 1.6 раза быстрее, чем одна строка, которая использует backreferencing и нежадный: s/\A\s*(.*?)\s*\Z/\1/. –  Peter.O 26.03.2012, 18:08

В awk, сохранение пустых строк, принимая файл хорошо отформатировано, но логика могла быть добавлена для проверки файла:

awk -v RS="" '{for(i=1; i<=NF; i++) a[i]=$i
  getline
  for(i=1; i<=NF; i++) print a[i] " " $i
  print ""}' file
4
27.01.2020, 20:01
<input sed -nr '/^[A-Z]{4}$/,/^$/w out1
                /^[0-9]{4}$/,/^$/w out2'
paste -d' ' out1 out2 |sed 's/^ $//' 

или, в одноэтапном, без временных файлов

paste -d' ' <(sed -nr '/^[A-Z]{4}$/,/^$/p' input) \
            <(sed -nr '/^[0-9]{4}$/,/^$/p' input) | sed 's/^ $//' 

Последнее sed шаг удаляет разделитель на пустых строках, который представлен paste...

4
27.01.2020, 20:01

С emacs используют прямоугольные операции, чтобы сократить текстовые строки и вставить их перед числовыми строками.

3
27.01.2020, 20:01
  • 1
    Спасибо, но не действительно подходящий для 15 000 + строки! + 1 для рабочей идеи и Вам нужен представитель :) –  NWS 24.03.2012, 18:21

Если записи в порядке,

  1. Разделите вход на алфавитные записи и числовые записи, с помощью grep:

    • grep "[[:alpha:]]\+" < file > alpha
    • grep "[[:digit:]]\+" < file > digit
  2. Присоединитесь к двум получающимся файлам, alpha и digit, использование paste:

    • paste alpha digit (можно добавить -d " " таким образом, это использует пространство вместо вкладки),
2
27.01.2020, 20:01
  • 1
    Без временных файлов: paste <(grep "[[:alpha:]]\+" file) <(grep "[[:digit:]]\+" file) или с единственной заменой процесса: grep "[[:alpha:]]\+" file | paste - <(grep "[[:digit:]]\+" file). –  jfg956 24.03.2012, 20:52

Слишком плохой awk не имеет хороших функций нажатия/поп/несдвига/сдвига. Вот короткий отрывок Perl

perl -M5.010 -lne '
  given ($_) {
    when (/^[[:alpha:]]+$/) {push @alpha, $_}
    when (/^\d+$/) {say shift(@alpha), " ", $_}
    default {say}
  }
'
1
27.01.2020, 20:01
  • 1
    Когда я выполняю его, это производит дополнительную (ведущую) пустую строку на группу. –  Peter.O 26.03.2012, 11:41
  • 2
    из-за default пункт, пустые строки сразу печатаются, таким образом, пробел прежде "1234" покажет перед строкой "AAAA". –  glenn jackman 26.03.2012, 13:47
  • 3
    из-за default пункт, пустые строки сразу печатаются, таким образом, пробел прежде "1234" покажет перед строкой "AAAA". –  glenn jackman 26.03.2012, 13:47

Дайте файл с текстом, попробуйте использовать pr и обработайте синтаксис замен следующим образом:

$ pr -mt <(grep -i "^[a-z]" file.txt) <(grep -i "^[0-9]" file.txt)
AAAA                    1234
BBBB                    5678
CCCC                    9012
DDDD                    3456
EEEE                    7890

Вы можете настроить ширину на -w9 или удалить пробелы на sed "s/ //g".

0
27.01.2020, 20:01

Теги

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