2013-05-19 31 views
-3

我想编写一个UNIX脚本,请执行下列操作有FF结果:如何重新排列文本文件输出结果

textfile1包含以下文本:

keyval1,1 
    keyval1,2 
    keyval1,3 
    keyval1,4 
    keyval2,1 
    keyval2,2 
    keyval3,1 
    keyval4,1 
    keyval4,3 
    keyval4,4 

预期结果:

keyval1 (1,2,3,4) 
    keyval2 (1,2) 
    keyval2 (1) 
    keyval4 (1,3,4) 

谢谢。

我是新来的unix,这是我迄今为止所做的。这不是尚未虽然:(

#!/bin/ksh 
f1 = 'cut -d "," -f 1 keyval.txt' 
f2 = 'cut -d "," -f 2 keyval.txt' 
while f1 <> f2 
do 
echo f1 "("f2")" 
done > output.txt 
+1

而你在哪里打? –

+0

^h我,我更新了我的帖子。 – mysticfalls

回答

2

您可以轻而易举做到这一点使用AWK工作:

#!/usr/bin/awk -f 
BEGIN { 
    FS = "," 
    closeBracket = "" 
} 

{ 
    if (key != $1) 
    { 
     key = $1 
     printf "%s%s (%s", closeBracket, key, $2 
    } 
    else 
    { 
     printf ",%s", $2 
    } 

    closeBracket = ")\n" 
} 

END { 
    printf "%s", closeBracket 
} 
+0

嗨,感谢您的回复,但它似乎没有工作..什么是在if语句中的键的价值? – mysticfalls

+1

它作为空字符串开始,但在读入一行后,它成为第一个字段(例如keyval1,keyval2)。你如何运行它,输出是什么? **(1)**将代码放入一个文件(例如'group.awk'),设置执行权限('chmod + x group.awk'),然后使用'./group.awk '运行,或**(2)**在命令行输入全部内容:'awk'BEGIN ...}''。 – tom

+0

明白了!在#/ usr/bin ...谢谢!!!请问是什么使用%s? – mysticfalls

3

有点迟到了,但我有这样一个奠定左右,几乎是:

#!/usr/bin/perl 
while (<>) 
{ 
    /(.+),(.?+)\s*/; 
    push @{$h{$1}}, $2; 
} 
print map {"$_ (" . join(',', @{$h{$_}}) . ")\n"} sort keys %h; 

不是特别漂亮,但它完成这项工作。