Как, Falmarri указал в его комментарии, Вы не работаете fdisk
как корень.
Самый легкий способ сделать это, должен работать:
$ sudo fdisk
Получить первые столбцы в каждой строке с помощью 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
Кто-то еще может ответить в 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]
Это - больше интересного приложения 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"
И вот острота 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