Свяжите строки первым столбцом awk или sed

Как, Falmarri указал в его комментарии, Вы не работаете fdisk как корень.

Самый легкий способ сделать это, должен работать:

$ sudo fdisk 

12
24.06.2015, 09:10
4 ответа

Получить первые столбцы в каждой строке с помощью awk Вас может сделать следующее:

< testfile awk '{print $1}'
aaa
aaa
aaa
www
hhh
hhh

Это Ваши ключи для остальной части строк. Таким образом, можно создать хеш-таблицу, с помощью первого столбца в качестве ключа и второго столбца строки как значение:

< testfile awk '{table[$1]=table[$1] $2;} END {for (key in table) print key " => " table[key];}'
www => yyy
aaa => bbbNULLbbb
hhh => 111111

Для получения целого отдыха строки, начиная со столбца 2 необходимо собрать все столбцы:

< testfile awk '{line="";for (i = 2; i <= NF; i++) line = line $i " "; table[$1]=table[$1] line;} END {for (key in table) print key " => " table[key];}'
www => yyy hhh NULL NULL NULL NULL 
aaa => bbb ccc ddd NULL NULL NULL NULL NULL NULL NULL NULL NULL bbb ccc    NULL NULL NULL NULL 
hhh => 111 333 yyy ooo hyy uuuioooy 111 333 yyy ooo hyy NULL 
8
27.01.2020, 19:56
  • 1
    Привет, да ему действительно была нужна разбивка к хеш-таблицам.Спасибо! –  tiny 11.09.2012, 10:34
  • 2
    @tiny - Я предполагал, что упорядочивание должно было быть сохранено. Этот не имеет место (этот ответ производит упорядочивание, соответствующее механизму хеширования, не Вашему первоначальному заказу)? –  ire_and_curses 11.09.2012, 10:36

Кто-то еще может ответить в awk или sed, но версия Python проста и могла бы быть полезна Вам.

#!/usr/bin/env python

input_file = 'input.dat'
in_fh      = open(input_file, 'r')

input_order = []
seen        = {}
for line in in_fh:    
    # Remove the newline character...
    line = line[:-1]

    # Separate the first column from the rest of the line...
    key_col, sep, rest_of_line = line.partition(" ")
    rest_of_line = sep + rest_of_line  

    # If we've seen this key already, concatenate the line...
    if key_col in seen:
        seen[key_col] += rest_of_line
    # ...otherwise, record the ordering, and store the new info
    else:
        input_order.append(key_col)
        seen[key_col] = rest_of_line

in_fh.close()

# Dump the ordered output to stdout
for unique_col in input_order:
    print unique_col + seen[unique_col]
3
27.01.2020, 19:56
  • 1
    Очень прохладный. С моим нулевым Python опыта мне даже удалось отредактировать сценарий, что он берет первый аргумент в качестве входного имени файла :) –  tiny 11.09.2012, 10:30

Это - больше интересного приложения coreutils, я подозреваю, что это не очень эффективно с большим входом, поскольку это вызывает соединение для каждой строки во входе.

touch outfile
while read; do
  join -a1 -a2 outfile <(echo $REPLY) > tmp
  mv tmp outfile
done < infile

Для улучшения это - эффективность, сохраняя outfile и tmp к электронному диску мог бы помочь.

Править

Или без временных файлов:

out=""
while read; do
  out=$(join -a1 -a2 <(echo -n "$out") <(echo -n "$REPLY"))
done < infile

echo "$out"
2
27.01.2020, 19:56

И вот острота Perl:

$ perl -e 'my %h; while(<>){chomp; @a=split(/\s+/); $k=shift(@a); $h{$k}.=join(" ", @a) . " "; } map{$h{$_}=~s/\s*$//; print "$_ $h{$_}\n}keys(%hash);' infile
2
27.01.2020, 19:56

Теги

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