如何解决如何从bash
我正在做一个项目,该项目要求我输入一些 .bed,从每个文件中提取一列,仅获取某些参数并计算每个文件有多少个参数。我对 bash 非常缺乏经验,所以我不知道大部分命令。但是有了这行代码,它应该可以解决问题。
for FILE in *; do cat $FILE | awk '$9>1.3'| wc -l ; done>/home/parallels/Desktop/EP_Cell_Type.xls
我将这些值保存在 .xls 中,因为我需要用它们做一些图表。 现在我想用 -ls 获取文件名并将它们保存在我的 .xls 的第一列中,而我的参数应该在我的 excel 文件的第二列中。 我设法使用以下命令将所有内容保存在一列中:
ls>/home/parallels/Desktop/EP_Cell_Type.xls | for FILE in *; do cat $FILE | awk '$9>1.3'-x| wc -l ; done >>/home/parallels/Desktop/EP_Cell_Type.xls
我的示例文件是:A549.bed、GM12878.bed、H1.bed、HeLa-S3.bed、HepG2.bed、Ishikawa.bed、K562.bed、MCF-7.bed、SK-N-SH。床并包含在仅包含这些文件的文件夹中。
输出是所有文件名和同一列上的值的列表,如下所示:
第 1 列 |
---|
A549.床 |
GM12878.bed |
H1.床 |
HeLa-S3.bed |
HepG2.bed |
石川床 |
K562.床 |
MCF-7.bed |
SK-N-SH.bed |
4536 |
8846 |
6754 |
14880 |
25440 |
14905 |
22721 |
8760 |
28286 |
但我需要的应该是这样的:
文件名 | #BS |
---|---|
A549.床 | 4536 |
GM12878.bed | 8846 |
H1.床 | 6754 |
HeLa-S3.bed | 14880 |
HepG2.bed | 25440 |
石川床 | 14905 |
K562.床 | 22721 |
MCF-7.bed | 8760 |
SK-N-SH.bed | 28286 |
解决方法
假设 OP 的 awk
程序(正确地)找到了所有需要的行,一个更简单(更快)的解决方案可以完全用 awk
编写。
跟踪匹配行数然后打印文件名和行数的 awk
解决方案:
awk '
FNR==1 { if ( count >= 1 ) # first line of new file? if line counter > 0
printf "%s\t%d\n",prevFN,count # then print previous FILENAME + tab + line count
count=0 # then reset our line counter
prevFN=FILENAME # and save the current FILENAME for later printing
}
$9>1.3 { count++ } # if field #9 > 1.3 then increment line counter
END { if ( count >= 1 ) # flush last FILENAME/line counter to stdout
printf "%s\t%d\n",count
}
' * # * ==> pass all files as input to awk
出于测试目的,我将 $9>1.3
替换为 /do/
(匹配包含字符串 'do'
的任何行)并针对包含各种脚本和数据文件的目录运行。这生成了以下制表符分隔的输出:
bigfile.txt 7
blocker_tree.sql 4
git.bash 2
hist.bash 4
host.bash 2
lines.awk 2
local.sh 3
multi_file.awk 2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。