Dataframe 如何从表中以分号分隔的字段中保留第一个、最小值和最大值?

Dataframe 如何从表中以分号分隔的字段中保留第一个、最小值和最大值?,dataframe,awk,sed,Dataframe,Awk,Sed,我有一个以制表符分隔的文件,每个字段有许多分号分隔的值这是文件: Name First Last foo3;foo3;foo3;foo3;foo3 11869;12010;12179;12613;12613 12227;12057;12227;12721;12697 bar10;bar10;bar10 14404;15005;15796 14501;15038;15947 locM;locM;locM;locM 29554;30267;30564;30976 30039;306

我有一个以制表符分隔的文件,每个字段有许多分号分隔的值这是文件:

Name First Last
foo3;foo3;foo3;foo3;foo3    11869;12010;12179;12613;12613   12227;12057;12227;12721;12697
bar10;bar10;bar10   14404;15005;15796   14501;15038;15947
locM;locM;locM;locM 29554;30267;30564;30976 30039;30667;30667;31109
Name First Last
foo3    11869   12721
bar10   14404   15947
locM    29554   31109
我想[在BASH或R中]对该文件执行以下操作:

Name First Last
foo3;foo3;foo3;foo3;foo3    11869;12010;12179;12613;12613   12227;12057;12227;12721;12697
bar10;bar10;bar10   14404;15005;15796   14501;15038;15947
locM;locM;locM;locM 29554;30267;30564;30976 30039;30667;30667;31109
Name First Last
foo3    11869   12721
bar10   14404   15947
locM    29554   31109
(1) 在第一列中,仅保留一个条目

(2) 在第二列中,仅保留 以分号分隔的数字列表

(3) 在第三列中,仅保留 以分号分隔的数字列表

以下是所需的输出:

Name First Last
foo3;foo3;foo3;foo3;foo3    11869;12010;12179;12613;12613   12227;12057;12227;12721;12697
bar10;bar10;bar10   14404;15005;15796   14501;15038;15947
locM;locM;locM;locM 29554;30267;30564;30976 30039;30667;30667;31109
Name First Last
foo3    11869   12721
bar10   14404   15947
locM    29554   31109
应该注意的是,最高值和最低值并不总是分号分隔列表中的第一个和最后一个值

更新(解决问题的业余想法):

Name First Last
foo3;foo3;foo3;foo3;foo3    11869;12010;12179;12613;12613   12227;12057;12227;12721;12697
bar10;bar10;bar10   14404;15005;15796   14501;15038;15947
locM;locM;locM;locM 29554;30267;30564;30976 30039;30667;30667;31109
Name First Last
foo3    11869   12721
bar10   14404   15947
locM    29554   31109
  • 为了解决(1),我相信类似于
    awk-F”;“'BEGIN{ORS=“/t”}!查看[$1]+'input.txt>output.txt
    将有助于删除 重复的实例,但是我还没有弄明白如何写这个 完全是
  • 为了解决(2)问题,我相信类似于
    cut-f2-d”/t“input.txt>output.txt | cut-f1-d”;“| sort-n | head-1
    的东西也会出现 能够选择以分号分隔的最小数字 名单
  • 为了解决(3)问题,我相信类似于
    cut-f2-d”/t“input.txt>output.txt | cut-f1-d”;“| sort-n | tail-1
    的东西也会出现 能够选择以分号分隔的最大数字 名单

请您尝试以下内容,并仅根据所示样品进行书写和测试

awk '
{
  split($1,array,";")
  num1=split($2,array1,";")
  num2=split($3,array2,";")
  min=array1[1]
  for(i=2;i<=num1;i++){
    min=(min<array1[i]?min:array1[i])
  }
  max=array2[1]
  for(i=2;i<=num2;i++){
    max=(max>array2[i]?max:array2[i])
  }
  print array[1],min,max
}'  Input_file
awk'
{
拆分($1,数组“;”)
num1=拆分($2,array1,“;”)
num2=拆分($3,array2,“;”)
最小=阵列1[1]
对于(i=2;i
val()
函数可以在子字段中返回您想要的任何位置的值,而不仅仅是第一个位置,而且显然它可以很容易地得到增强,以返回您需要从子字段中提取的任何其他类型的信息,例如平均值。

这可能适合您(GNU-sed和Bash):

不要处理标题

将每个数据行拆分为三列,由制表符分隔(列中的字段由
分隔):

  • 将第一列缩减为该列的第一个字段
  • 对第二列进行数字排序,只保留第一个字段,即最小值
  • 对第三列进行数字排序,只保留最后一个字段,即最大值

  • 通过使用
    e
    标志评估替换命令的RHS来实现这一点。

    鼓励本网站的用户在此处分享他们的尝试,因此鼓励所有用户以代码的形式展示他们的努力,以解决他们自己的问题。因此,请在您的问题中添加相同的内容,并那么让我们知道。顺便说一句,我的答案已经准备好了,一旦你加上努力,就会加上欢呼。非常公平。我对编码非常陌生,所以承认我不知道到底哪些工具可以帮我找到解决方案。我显然会继续研究如何自己解决这个问题,因为我需要尽快解决这个问题,以推进这个项目。我知道对于有经验的程序员来说,在这里发布红色帖子是通知我[和其他人]的一种有效方式以这种方式处理数据可能使用的函数。我没有恶意,也没有滥用此网站。这真是太棒了@RavinderSingh13!非常感谢。我可以确认它适用于我的数据集。请注意,在最小值计算中,零分钟后的任何正值都会覆盖最小值。内部条件不难确定ix但在我看来,将最小值/最大值初始化为第一项(如Ed的回答)更为可靠。@EdMorton,谢谢您,先生,谢谢您Iuciole75w让我知道。先生,您能提出同样的建议吗?如果您有其他建议,我将在深夜查看先生:)再次感谢并干杯。@RavinderSingh13不客气。我为您更新了未注释的脚本,保留了注释的脚本,因为我懒得重写注释(因此您很容易看到更改的内容)!规则是,对于任何最小值或最大值计算,您应该始终将最小值/最大值变量初始化为读取的第一个值。@EdMorton,感谢您的帮助,先生,谢谢您的修复抱歉,我遇到了背对背的生产问题,真的想不起来,非常感谢您的帮助,先生,谢谢大家,干杯