Awk 添加以公共字符串开头的数据

Awk 添加以公共字符串开头的数据,awk,grep,Awk,Grep,嗨,我正在尝试组织一个我拥有的数据集。我将非常感谢你的帮助!我的数据如下所示: >abc1_1 apple orange >abc1_2 grape melon >abc2_4 tomato celery >abc2_5 carrot cabbage >abc1 apple orange grape melon >abc2 tomato celery carrot cabbage 我想将标题中的前4个字母(即add>abc1_1和>abc1_2以及titl

嗨,我正在尝试组织一个我拥有的数据集。我将非常感谢你的帮助!我的数据如下所示:

>abc1_1
apple
orange
>abc1_2
grape
melon
>abc2_4
tomato
celery
>abc2_5
carrot
cabbage
>abc1
apple
orange
grape
melon
>abc2
tomato
celery
carrot
cabbage
我想将标题中的前4个字母(即add>abc1_1和>abc1_2以及title it>abc1)的所有数据相加,结果如下:

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

请帮帮我

这可能是您想要的,具体取决于您希望如何处理重复项:

$ 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 shell脚本:

foreach file ( `ls * | perl -pe 's/(....).*/$1/' | sort -u` )
   cat ${file}* > ${file}
end
这是我的解决办法

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

您的输出应该是什么样子?你试过什么?哇,当你说“把所有的数据加起来”时,我从来没有猜到这就是你想要的输出!看起来你指的是总量。修改您的输入,将kiwi添加到abc1_1和abc1_2输入以及abc1输出中,这样我们就可以看到您希望如何处理重复项。在看到答案后,请想一想:有时您必须咬紧牙关,使用Python或Perl编写一个“true”程序。最有可能在未来会更容易管理/维护。谢谢大家的帮助。如果是这样,你应该考虑接受帮助你最多的答案。您可以点击答案旁边的复选标记,将答案从空心切换为绿色。看看你是否有任何疑问!如果你不想在你的文件中有重复的内容,你可以在cat之后进行sort-u。永远不要用[t]csh编写脚本。谷歌
csh为什么不
。但我不确定这个答案和这个问题有什么关系。也许你想回答另一个问题?我在回答这个问题。它将生成所需的输出。对于较长的复杂脚本,Csh不是一个好主意。大家都同意这一点。