文件我有文件類似的東西是需要移調在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
文件我有文件類似的東西是需要移調在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
這是一個可以理解的嘗試使用非標準的工具,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
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] }
}
'|排序'也被要求 – Unreason 2010-10-13 08:07:32
ghostdog74感謝您的回覆..您的腳本工作正常。但我有一個問題,我有超過20Lakhs行的文件..對於您使用的循環可能需要很多時間。你對此有任何建議。 – gyrous 2010-10-13 09:05:46
什麼是20Lakhs行? awk是一個非常快速的文本處理工具。我非常懷疑它會對你的問題緩慢。 – ghostdog74 2010-10-13 09:44:23
這是蟒蛇的解決方案。腳本從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]))
這裏有一個在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
你可能有更好的運氣與多但是,通過解決方案。我真的沒有時間爲你寫。以下是大綱:
爲什麼說「轉置」? – Wok 2010-10-13 07:59:35
這與單元測試有什麼關係?列表的密鑰的散列可以在一次傳遞中填充,然後迭代散列以獲取所需的輸出。 –
Gishu
2010-10-13 08:00:32
你可能只想用一種具有哈希和正則表達式支持的語言寫一個簡單的腳本,例如Perl的。 – 2010-10-13 08:01:39