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,感谢您的帮助,先生,谢谢您的修复抱歉,我遇到了背对背的生产问题,真的想不起来,非常感谢您的帮助,先生,谢谢大家,干杯