2010-10-13 15 views
1

文件我有文件類似的東西是需要移調在UNIX

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

1列數隨時可能重複,但我需要輸出這個

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

輸出是sort和uniq

+1

爲什麼說「轉置」? – Wok 2010-10-13 07:59:35

+1

這與單元測試有什麼關係?列表的密鑰的散列可以在一次傳遞中填充,然後迭代散列以獲取所需的輸出。 – Gishu 2010-10-13 08:00:32

+0

你可能只想用一種具有哈希和正則表達式支持的語言寫一個簡單的腳本,例如Perl的。 – 2010-10-13 08:01:39

回答

2

這是一個可以理解的嘗試使用非標準的工具,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 
5
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] } 
} 
+0

'|排序'也被要求 – Unreason 2010-10-13 08:07:32

+0

ghostdog74感謝您的回覆..您的腳本工作正常。但我有一個問題,我有超過20Lakhs行的文件..對於您使用的循環可能需要很多時間。你對此有任何建議。 – gyrous 2010-10-13 09:05:46

+0

什麼是20Lakhs行? awk是一個非常快速的文本處理工具。我非常懷疑它會對你的問題緩慢。 – ghostdog74 2010-10-13 09:44:23

1

這是蟒蛇的解決方案。腳本從stdin讀取數據。

#!/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

這裏有一個在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.