Транспонировать файл в Unix - PullRequest
       10

Транспонировать файл в Unix

1 голос
/ 13 октября 2010

У меня есть файл, подобный этому

1111,K1
2222,L2
3333,LT50
4444,K2
1111,LT50
5555,IA
6666,NA
1111,NA
2222,LT10

Требуемый вывод

1111,K1,LT50,NA
2222,L2,LT10
3333,LT50
4444,K2
5555,IA
6666,NA

1-й номер столбца может повторяться в любое время, но вывод, который мне нужен, является sort и uniq

Ответы [ 4 ]

5 голосов
/ 13 октября 2010
awk -F"," '{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}' file | sort

Если у вас большой файл, вы можете попробовать распечатать элементы каждые несколько строк, например, 50000

BEGIN{FS=","}
{ a[$1]=a[$1]FS$2 }
NR%50000==0 {
  for(i in a) { print  a[i] }
  delete a  #delete array so it won't take up memory
}
END{
  for(i in a){ print a[i] }
}
2 голосов
/ 13 октября 2010

Вот понятная попытка использования нестандартного инструмента, оболочки SQLite. База данных находится в памяти.

echo    'create table tmp (a int, b text);
        .separator ,
        .import file.txt tmp
        .output out.txt
        SELECT a, group_concat(b) FROM tmp GROUP BY a ORDER BY a ASC;
        .output stdout
        .q' | sqlite
1 голос
/ 13 октября 2010

Это решение в python.Скрипт читает данные со стандартного ввода.

#!/usr/bin/env python
import sys
d = {}
for line in sys.stdin.readlines():
  pair = line.strip().split(',')
  d[pair[0]] = d.get(pair[0], [])
  d[pair[0]].append(str(pair[1]))
for key in sorted(d):
  print "%s,%s" % (key, ','.join(d[key]))
0 голосов
/ 15 октября 2010

Вот один в Perl, но он не будет особенно эффективным:

#!/usr/bin/perl -w
use strict;
my %lines;
while (<>) {
    chomp;
    my ($key, $value) = split /,/;
    $lines{$key} .= "," if $lines{$key};
    $lines{$key} .= $value;
}

my $key;
for $key in (keys(%lines)) {
    print "$key,$lines{$key}\n";
}

Используйте вот так:

$ ./command <file >newfile

Впрочем, вам, скорее всего, повезет больше с многоходовым решением. У меня действительно нет времени, чтобы написать это для вас. Вот схема:

  1. Возьмите и удалите первую строку из файла.
  2. Анализирует оставшуюся часть файла, объединяет любую подходящую строку и удаляет ее.
  3. В конце файла выведите новую длинную строку.
  4. Если в файле все еще есть содержимое, вернитесь к 1.
...