0

我正在做一个项目,该项目需要我在输入中获取一些 .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.bed 并且是包含在仅包含这些文件的文件夹中。

输出是所有文件名的列表和同一列上的值,如下所示:

第 1 列
A549.床
GM12878.床
H1.床
HeLa-S3.床
HepG2.床
石川床
K562.床
MCF-7.床
SK-N-SH.床
4536
8846
6754
14880
25440
14905
22721
8760
28286

但我需要的是这样的:

文件名 #BS
A549.床 4536
GM12878.床 8846
H1.床 6754
HeLa-S3.床 14880
HepG2.床 25440
石川床 14905
K562.床 22721
MCF-7.床 8760
SK-N-SH.床 28286
4

1 回答 1

0

假设 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", prevFN, 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
于 2021-03-29T12:15:19.720 回答