添加以常用字符串开头的数据

问题描述:

嗨,我正在尝试组织我拥有的数据集。我会很感激的帮助!我的数据看起来是这样的:添加以常用字符串开头的数据

>abc1_1 
apple 
orange 
>abc1_2 
grape 
melon 
>abc2_4 
tomato 
celery 
>abc2_5 
carrot 
cabbage 

我想补充了所有具有相同的前4个字母的标题的数据(即添加> abc1_1和> abc1_2和标题它> ABC1),所以它看起来像这个:

>abc1 
apple 
orange 
grape 
melon 
>abc2 
tomato 
celery 
carrot 
cabbage 

请帮帮我!

+1

您的输出应该如何显示?你有什么尝试? – fedorqui 2014-10-06 16:21:09

+0

哇,当你说“合计所有数据”时,我从来没有猜到过,那是你正在寻找的输出!它看起来像你的意思是聚合。修改您的输入以将kiwi添加到abc1_1和abc1_2输入以及abc1输出,以便我们可以看到您希望如何处理重复项。 – 2014-10-06 16:33:48

+0

看到答案后,想一想:有时你只需咬紧牙关,用Python或Perl编写一个“真正的”程序。未来很可能会更易于管理/维护。 – pepoluan 2014-10-07 09:21:49

这可能是你想要的,这取决于你如何想重复处理:

$ awk -F_ '/^>/{key=$1; next} {data[key] = data[key] ORS $0} END{for (key in data) print key data[key]}' file 
>abc1 
apple 
orange 
grape 
melon 
>abc2 
tomato 
celery 
carrot 
cabbage 

如果您的所有文件在同一目录此tcsh外壳脚本:

foreach file (`ls * | perl -pe 's/(....).*/$1/' | sort -u`) 
    cat ${file}* > ${file} 
end 
+0

如果你不想在你的文件中有重复,你可以在cat之后进行排序。 – 2014-10-06 16:40:34

+0

切勿在[t] csh中编写脚本。谷歌'csh为什么不'。但我其实不确定这个答案是如何与问题相关的。也许你打算回答一个不同的问题? – 2014-10-06 16:40:55

+0

我正在回答这个问题。它会产生所需的输出。对于较长的复杂脚本,Csh不是一个好主意。大家都同意这一点。 – 2014-10-06 17:08:58

这里是我的解决办法

sed -r 's/>(....).*/>\1/' | xargs | sed 's/ >/\n>/g' | sort | awk '$1==prev{$1="";print;next}$1!=prev{prev=$1}1' | xargs -n1