Shell统计第10列至最后一列,每列中有多少个第三个字符为1的行
时间: 2024-01-22 07:21:13 浏览: 65
可以使用 awk 命令来实现统计第 10 列至最后一列中第三个字符为 1 的行数。具体命令如下:
```
awk '{count=0;for(i=10;i<=NF;i++)if(substr($i,3,1)=="1")count++;if(count>0)print count}' 文件名
```
其中,`NF` 表示当前行的总列数,`substr($i,3,1)` 表示取第 `i` 列中第三个字符,如果为 1 则计数器 `count` 加 1。如果 `count` 大于 0,则表示该行中有第三个字符为 1 的列,输出 `count` 的值。
如果要统计所有行中第三个字符为 1 的列数之和,可以将命令修改为:
```
awk '{count=0;for(i=10;i<=NF;i++)if(substr($i,3,1)=="1")count++;sum+=count}END{print sum}' 文件名
```
其中,`END` 表示在处理完所有行后执行的操作,这里统计了所有行中第三个字符为 1 的列数之和,并输出结果。
相关问题
shell脚本删除列demo
### 回答1:
可以使用shell脚本删除列,下面是一个demo:cut -d, -f1,2,4,5,6,7,8,9,10,11,12,13,14 - --output-delimiter=" " test.csv > test_clean.csv
### 回答2:
shell脚本删除列demo可以通过使用awk命令来实现。awk是一种用于处理文本的流式编辑器,可以很方便地操作文本文件的列。
以下是一个示例的shell脚本删除列demo:
```shell
#!/bin/bash
# 假设我们有一个名为data.txt的文本文件,内容如下:
# 列1 列2 列3 列4
# 1 2 3 4
# A B C D
# 要删除第3列,可以使用awk命令,并将结果重定向到一个新文件中
awk '{$3=""; print}' data.txt > new_data.txt
# 使用awk命令,将每一行的第3列的内容设置为空,然后打印整行。结果将被重定向到新的文件new_data.txt中。
# 执行脚本后,new_data.txt 文件将会是如下内容:
# 列1 列2 列3 列4
# 1 2 4
# A B D
# 第3列已被删除,原来的数据文件data.txt并不会改变。
```
这是一个简单的shell脚本示例,用于演示如何通过使用awk命令来删除列。你可以根据需要修改列的位置和文件名来删除不同的列。
### 回答3:
shell脚本删除列demo可以使用awk命令来完成。以下是一个简单的示例:
假设有一个名为input.txt的文件,文件内容如下:
```
姓名,性别,年龄
张三,男,25
李四,女,30
王五,男,35
```
现在我们想要删除第二列(性别)。可以编写一个shell脚本如下:
```bash
#!/bin/bash
# 定义输入文件名和输出文件名
input_file="input.txt"
output_file="output.txt"
# 使用awk命令删除第二列,并将结果输出到output.txt文件中
awk 'BEGIN {FS=OFS=","} { $2 = ""; print $0 }' "$input_file" > "$output_file"
```
脚本中,我们首先定义了输入文件名`input.txt`和输出文件名`output.txt`。然后使用awk命令,通过设置输入和输出的字段分隔符为逗号`FS=OFS=","`,将第二列设为空字符串`$2 = ""`,然后打印整行`print $0`。最后将结果输出到`output.txt`文件中。
运行脚本后,`input.txt`中的内容将会被处理,删除第二列,并将结果保存到`output.txt`中。输出文件的内容如下:
```
姓名,,年龄
张三,,25
李四,,30
王五,,35
```
注意,原始文件`input.txt`并没有被改动,只有输出文件`output.txt`被生成和修改。
解释以下shell代码每行的意义echo "××××××欢迎使用字符串匹配系统×××××" while : do echo " ××××××××××××××××××" echo " × 请选择功能" × echo " × 0.检查程序功能"× echo " × 1.字符串匹配" × echo " × 2.排 序" × echo " × 3.查 找" × echo " × 4.数据可视化" × echo " × 5.退 出" × echo " ××××××××××××××××××" read -rsN1 number case $number in 0) sudo apt-get install bowtie2 sudo apt-get install dos2unix sudo apt-get install samtools ;; 1) dos2unix ref.fa dos2unix reads1.fq bowtie2-build ref.fa ref bowtie2 -x ref -U reads1.fq -S result1.sam echo "匹配完成" echo "匹配结果存入result1.sam" ;; 2) declare -a y1 declare -a y2 declare -a y3 y1=(`awk '{print $1}' result1.sam`) y2=(`awk '{print $4}' result1.sam`) y3=(`awk '{print $10}' result1.sam`) length=0 length=${#y1[@]} for((i=0;i<length;i++));do { echo "${y1[i+3]} ${y2[i+1]} ${y3[i]}">>result1.txt } done sort -n -k 2 -t " " result1.txt>>result2.txt #将result.txt以第二列排序,输出存储到result2.txt grep -v ' 0 ' result2.txt >> result3.txt #排除匹配结果为0的结果并保存在result3.txt里 echo "排序完成!结果已经放在result3.txt里面" ;; 3)echo "请输入查找的左/右边界" read l1 r1 cat result1.txt | awk '{if($2>='$l1'&&$2<='$r1'){print $0>"result.txt"}}' echo "查找结果已经放在了resuyt.txt文件里。" ;; 4) echo "数据可视化" samtools view -bS result1.sam > result1.bam #sam文件转换为bam格式 samtools sort result1.bam result1.sort #对bam文件进行排序 samtools index result1.sorted.bam #创建bai索引 samtools tview result1.sort.bam ref.fa #可视化界面展示 ;; 5)echo "你已安全退出,欢迎下次使用!" exit 0 ;; esac done
这段代码实现了一个基于shell的字符串匹配系统的菜单功能,具体解释如下:
第一行使用echo命令输出欢迎信息。
while : do表示无限循环,即菜单一直显示在屏幕上。
echo命令输出菜单的各个选项。
read命令等待用户输入一个字符,并将其存储在number变量中。
case语句根据用户输入的数字执行不同的命令。
第一个选项中,使用sudo apt-get命令安装bowtie2、dos2unix和samtools程序。
第二个选项中,使用dos2unix命令将ref.fa和reads1.fq文件转换为UNIX格式,使用bowtie2命令对ref.fa和reads1.fq文件进行匹配,并将匹配结果存储在result1.sam文件中。
第三个选项中,使用awk命令从result1.sam文件中提取需要排序的三列数据,使用sort命令对result1.txt文件按照第二列进行排序并保存在result2.txt文件中,使用grep命令排除匹配结果为0的行并将结果保存在result3.txt文件中。
第四个选项中,使用samtools命令将result1.sam文件转换为result1.bam文件,并对其进行排序和创建bai索引,最后使用samtools tview命令在可视化界面展示结果。
第五个选项中,使用echo命令输出退出信息,并使用exit命令退出程序。
整个程序实现了一个基本的字符串匹配系统,用户可以通过菜单选择不同的功能进行数据处理和可视化。
阅读全文