根据另一个 csv 文件的标题在 csv 文件中选择列的 Unix shell 脚本
我有一个带有28,000列的CSV文件,我想使用Unix Shell脚本在另一个CSV文件中的标题中选择某些列.当我在服务器上工作时,我无法使用csvkit之类的工具,并且没有管理权以安装新工具.我已经阅读了许多有关此文章的文章,但无法获得我想要工作的内容,可能是因为以前的答案使用标签划分或空间界定文本而不是CSV.我是Shell脚本的新手(并且不必使用太多,因为我通常在R或Python中工作). 标题文件看起来像这样: $ cat headers.csv eid ABCD001 ABCD005 ABCD021 ABCD022 ...等(我需要大约50列,而不是顺序) 数据文件是一个CSV文件,具有各种格式(数字,字符)的数据 带有28,000列,包括我需要的所有50列,带有标头列,如标题文件. 我尝试了这篇文章: $ awk 'NR==FNR{a[$0]=NR;next}{for (i in a) printf "%s ", $a[i];print ""}
12 2024-04-22
编程技术问答社区
Unix shell 脚本--根据另一个 csv 文件中的标题从 csv 文件中选择列(带最小重现示例的重贴)
由于缺乏最小可重现的例子(MEA Culpa),因此将这个问题重新提出为以前的答案不起作用.抱歉,如果这是基本的,但我无法工作,并且花了很多时间尝试. 请参阅我之前发布的上一个问题: Unix shell脚本根据另一个CSV文件的标题选择CSV文件中的列 我创建了一个CSV标头文件,其中标头文件中的每一行都是我想要的列的名称.在data_file.csv本身中,第一行如下显示,每个列标题在第一行中,并用引号中包含数据: echo $(head -n 1 data_file.csv) "eid","132421-0.0","132422-0.0","132423-0.0", ... 我创建的标头文件看起来像这样,每个列标题为行没有引号. eid 24500-0.0 24503-0.0 24503-1.0 4526-0.0 4526-1.0 注意没有报价.如果我尝试将报价(手动)添加到eNeaders.csv文件,然后再次使用$ cat,我会在每个标题行上获
8 2024-04-22
编程技术问答社区
根据第一个字段匹配行,并合并第二个字段
我想使用awk,sed或类似的两个文件中的第二个字段中的条目组合. file0: string:data:moredata file1: string:random:moredata 如果第一个字段,字符串 in file0 在 file1 中具有匹配条目,则打印 $random:$data 选择字段似乎很琐碎: $ awk -F':' '{print $2}' filename 需要匹配行并打印匹配列$ 2 解决方案 这个 - 怎么样 awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2 执行: [jaypal~/Temp]$ cat file1 string:data:moredata [jaypal~/Temp]$ cat file2 string:random:moredata [
14 2024-04-22
编程技术问答社区
需要在 awk 脚本中保留列间距
看到了很多示例,但我似乎无法从 https://stackover.com/a/a/72720612 由另一个用户@just khaithang在此站点上,它运行良好,但我也需要保留我的列间距,因为这很关键. 这是我在这里发布几次的.txt文件示例.从1列的开头到第2至3列的开头,在开始的开头有1个空间,在2和4之间.脚本有关.结果从用户输入更改了日期,因此使用变量$broken_date.此脚本是从带有awk -v的另一个shell脚本中调用的.工作之间的""空间,但由于第1列有所不同,因此没有保持对齐. 146327A 0000000020220422 000002012633825-0003-1 137149D 0000000045220419 000004512632587-0003-0 137050C 0000000018220419 000001812632410-0003-
8 2024-04-22
编程技术问答社区
Unix 文件中任务列的最小值和最大值
我有一个文件,该文件包含第一列中的任务名称以及在第二列中完成任务所花费的时间: Task2, 3421 Task3, 3300 Task1, 1000 Task2, 1100 Task3, 1200 Task3, 1209 Task4, 1299 Task3, 1289 Task1, 1389 Task2, 1211 Task5, 1216 Task2, 1416 Task1, 2100 Task6, 2416 Task5, 2216 Task7, 1116 现在,我必须找到每个任务所花费的最小和最大时间,并以下面的格式输出 task, maxtime, min time 例如, Task1, 1000, 2100 (from the data given above) 解决方案 您可以尝试awk awk ' BEGIN{FS=","; OFS=", "} !($1 in max) || $2>max[$1]{max[$1]=$2}
12 2024-04-22
编程技术问答社区
使用 Awk 过滤器按总分降序获取学生记录详情
学生详细信息存储在文件系统中: Roll_no,name,socre1,score2 101,ABC,50,55 102,XYZ,48,54 103,CWE,42,34 104,ZSE,65,72 105,FGR,31,45 106,QWE,68,45 Q.将UNIX命令写入 display lold_no和学生的名称,其总分数大于100,学生详细信息应按照总分的降序进行分类. 总分计算如下: - ptatalscore = score1+score2 文件还满足标头(roll_no,name,socre1,score2) 我的解决方案: awk 'BEGIN {FS=",";OFS=" "} {if(NR>1){if($3+$4>100){s[$1]=$2}}} END{for (i in s) {print i,h[i]}}' stu.txt| sort -rk 2n 我没有得到如何根据总分数进行分类? 请帮助伙计们! 输出: -
26 2024-04-22
编程技术问答社区
下一个流程的迭代过程
我正在尝试在NextFlow中创建一个过程,其中需要2个输入,将直接使用krakenfile,而包含多行的fungalname fungalname都包含一个Specie的名称. 我想在fungalname文件中进行迭代,按行划线,对于每行/specie,我都会在其第三列中寻找包含该名称的所有行. 例如,如果我的fungalname包含以下内容: Aspergillus fumigatus Candida albicans 和krakenfile包含 xxxx 548 Aspergillus fumigatus zzzz 566 Candida albicans aaaa 598 Aspergillus fumigatus kkk 888 Candida albicans 我的输出应为2个文件,ASpergillus_fumigatus_lines.txt和Candida_albicans_lines.txt,其中每个都包含2
16 2024-04-22
编程技术问答社区
根据 1 个文件的第 1 列与 N 个文件的第 1 列进行比较分析,并根据第 1 列打印所有文件
我有一个选项卡分离的文件,如果第一个文件的第1列的ID与其他文件的第一个列匹配,则需要将文件_1与n(10)文件进行比较不是Presnt,第一个文件和其他文件列的NA.输入和预期输出文件的示例如下. 文件1 A 1.1 0.2 0.3 1.1 B 1.3 2.1 0.2 0.1 C 1.8 0.5 2.6 3.8 D 1.2 5.1 1.7 0.1 E 1.9 4.3 2.8 1.6 F 1.6 5.1 2.9 7.1 G 1.8 2.8 0.3 3.7 H 1.9 3.6 3.7 0.1 I 1.0 2.4 4.9 2.5 J 1.1 2.0 0.1 0.4 文件2 A d1 Q2 Q.3 E.1 B a.3 S.1 A.2 R.1 J
10 2024-04-22
编程技术问答社区
Shell 脚本-在文件中进行智能替换,在第二个文件中进行查找
我有两个文件,一个数据文件和一个查找文件. 必须通过一个值更改数据文件的一个字段,该值可以在查找文件中找到. 数据文件看起来像: 2013-04-24;1;0.1635;1.4135 2013-04-24;1;0.9135;1.4135 2013-04-24;2;0.9135;1.4135 查找文件看起来像: 1;2ab1e4c0-de4d-11e2-a934-0f0479162b1b 2;2ab21e90-de4d-11e2-9ce8-d368d9512bad 3;2ab2582e-de4d-11e2-bb5f-6b1f6c4437f8 结果必须是: 2013-04-24 2ab1e4c0-de4d-11e2-a934-0f0479162b1b 0.1635 1.4135 2013-04-24 2ab1e4c0-de4d-11e2-a934-0f0479162b1b 0.9135 1.4135 2013-04-24 2ab21e90-de4d-11
18 2024-04-22
编程技术问答社区
修复 shell 脚本以增加 semversion
我从来没有使用过shell(bash),但是在脚本中发现了一些错误,这些错误我曾经递增版本.脚本工作正常,直到这种情况 version=1.27.9 echo $version | awk -F. -v OFS=. 'NF==1{print ++$NF}; NF>1{if(length($NF+1)>length($NF))$(NF-1)++; $NF=sprintf("%0*d", length($NF), ($NF+1)%(10^length($NF))); print}' 1.28.0
12 2024-04-22
编程技术问答社区
使用 grep 只打印上下文
使用 grep ,您可以打印符合搜索查询的行.添加-C选项将打印两行周围的上下文,例如: > grep -C 2 'lorem' some context some other context **lorem ipsum** another line yet another line 类似地,您可以使用grep -B 2或grep -A 2分别使用两个或两个以下行的匹配行,例如: > grep -A 2 'lorem' **lorem ipsum** another line yet another line 是否可以跳过匹配线并仅打印上下文?具体来说,我只想打印在匹配项上方正好2行的行,例如: > some context 解决方案 如果您可以使用几个grep实例,则可以像我在评论部分中提到的那样尝试. $ grep -v "lorem"
12 2024-04-22
编程技术问答社区
在必须访问 awk 命令的 awk 脚本中使用 shell 命令
这本质上是我想要的命令,除了我想在第三列中打印一些会使用shell命令的特殊内容(或者只是我猜更多的尴尬命令),但我不知道我将如何适合这是原始的Awk语句).我只需要帮助的是pseudo命令替换$ 2,而在打印说明中的AR [$ 4,1 $ 1],但其余的是为了特异性. awk 'NR==FNR{ar[$3,$2]=$1+ar[$3,$2]; } NR>FNR && ar[$4,$1] {print "hs"$1,$2,`awk '$1 == #$1 from outer awk command# file2 | tail -n 1 | awk '{print $3}'`, ar[$4,$1]}' file1 file2 file1看起来像 5 8 t11 15 7 t12 3 7 t14 file2看起来像 8 4520 5560 t11 8 5560 6610 t12 8 6610 7400 t
12 2024-04-22
编程技术问答社区
使用 awk 命令左外连接多个文件数据
我的基本文件和多个文件具有基于基本文件的第一字段的常见数据.我需要结合所有数据的输出文件.我尝试了许多命令,因为文件大小花费了很多时间来使输出多次尴尬有帮助我,但我不知道尴尬阵列编程 示例 基本文件 aa ab ac ad ae 文件-1 aa,Apple ab,Orange ac,Mango 文件-2 aa,1 ab,2 ae,3 输出文件预期 aa,Apple,1 ab,Orange,2 ac,Mango, ad,, ae,,3 这是我尝试的: awk -F, 'FNR==NR{a[$1]=$0;next}{if(b=a[$1]) print b,$2; else print $1 }' OFS=, test.txt test2.txt 解决方案 您可以尝试2个连续的join.类似以下功能应该有效: join -a 1 -t, -e '' -o auto
12 2024-04-22
编程技术问答社区
如何使用空格和逗号连接行
我的文件包含以下内容: IP 111 22 25 我想以格式打印输出IP 111,22,25. 我尝试过tr ' ' ,,但它不起作用 解决方案 以下AWK脚本将执行请求: awk 'BEGIN{OFS=","} FNR==1{first=$0;next} {val=val?val OFS $0:$0} END{print first FS val}' Input_file 说明: 立即添加上述代码的说明. awk ' ##Starting awk program here. BEGIN{ ##Starting BEGIN section here of awk program. OFS="," ##Setting OFS as comma, output field separator. }
14 2024-04-22
编程技术问答社区
如何使用 awk 打印 regexp 匹配结果?
有没有一种方法可以使用awk命令在shell中打印REGEXP匹配(但仅匹配字符串)? 解决方案 是的,在awk中使用match()函数,并将其提供可选的数组参数(在我的示例中a).当您执行此操作时,第0个元素将是与正则匹配 的部分 $ echo "blah foo123bar blah" | awk '{match($2,"[a-z]+[0-9]+",a)}END{print a[0]}' foo123 其他解决方案 awk特定(与使用gawk相反)实现解决方案: $ echo "blah foo123bar blah" | awk 'match($0,/[a-z]+[0-9]+/) {print substr($0,RSTART,RLENGTH)}' foo123 其他解决方案 我使用此构造很多: split(substr($0, match($0, /[0-9]+ [Bb]ytes/)), a, " "); print a[1];
14 2024-04-22
编程技术问答社区
使用 bash 命令在列中创建编号集
i具有这种类型的文件-2列列表,其基因位于第一列中,染色体位置. 1:924024 1:924310 SAMD11 1:930353 SAMD11 1:930939 NOC2L 1:944858 NOC2L 1:946247 KLHL17 1:960891 KLHL17 1:961945 需要转换为此列表类型,以便保存2列格式.每个基因的每个基因都为每个基因(不是每一行). 1:na 1:924024 2:na 1:924310 3:SAMD11 1:930353 3:SAMD11 1:930939 4:NOC2L 1:944858 4:NOC2L 1:946247 5:KLHL17 1:960891 5:KLHL17 1:961945 我尝试使用这一行: awk -F "\t" -v OFS="\t" '{ ($1=="")? ($1=
18 2024-04-22
编程技术问答社区
用于从c文件中提取函数调用的Bash脚本
我是脚本编写的新手,我正在尝试从C文件中提取所有功能调用,所有功能都存在于目录中. 这是我到目前为止的代码,但似乎没有输出. #!/bin/bash awk '/[ \t]*[a-zA-Z_]*\(([a-zA-Z_]*[ \t]*,?)*\);/ {print $0}' *.c 我很难过. 另外,C文件都至少有一个函数调用. 解决方案 您应该调试Regexp.减少它直到获得一些匹配,然后再次添加其他部分,检查是否获得预期结果.
12 2024-04-09
编程技术问答社区
awk使其对系统的依赖性降低
如果我没记错的话,awk会根据OS语言来解析数字(例如,echo "1,2" | awk '{printf("%f\n",$1)}'将在英语系统中解释为1,而在逗号将整数与小数分开的系统中为1.2 ). 我不知道C printf是否也这样做,所以我添加了C标签. 我想修改以前的命令,以便它返回相同的值(1.2),无论使用什么系统. 解决方案 欢迎来到 locale 的丑陋.要解决您的问题,请首先将其设置为C一个. export LC_NUMERIC=C echo "1,2" | awk '...your code...' 要关闭其他依赖语言环境的tomfoolery,您可以 export LC_ALL=C 其他解决方案 如果您使用的gawk,则可以使用--use-lc-numeric选项. $ LC_NUMERIC=de_DE.UTF-8 awk 'BEGIN {printf("%f\n", "1,2")}' 1.000000 $ LC_N
8 2024-04-08
编程技术问答社区
AWK中的BREAK不工作
我有: AGT GTT TTA CAT TTT GTA TTT TTT TTC TAA ATT CTG AGT GTA GTC TTC CCT 我所需的输出是: AGT GTT TTA CAT TTT 我的代码: awk '{for (i=1;i i
14 2024-04-03
编程技术问答社区