linux 行数值求和,列数值求和
行求和
sum.txt 空格分隔
1 2 3 4 5
cat sum.txt | awk '{ for(i=1;i<=NF;i++) sum+=$i; print sum}'
复杂些文本
ahdhkjhdaj
adn;oda: 10, 8, 3, 12
msal'
cat sum.txt | sed -n '2p' | awk -F ":" '{print $2}' | awk -F "," '{ for(i=1;i<=NF;i++) sum+=$i; print sum}'
定位第二行用sed,搜索用grep
列求和
1
2
3
awk '{sum+=$1}END{print sum}' sum.txt
复杂些文本
agdasas
agafsasf:10
gfassas:8
gaas:3
asfd:12
faasa
sed -n '2,5p' sum.txt | awk -F ":" '{sum+=$2}END{print sum}'
awk 分隔符
awk默认分割符是空格。awk的分隔符还分为两种,“输入分隔符” 和 “输出分隔符” 。
(1)输入分隔符:英文原文field separator,简称FS。默认空白字符(即空格),awk默认以空白字符为分隔符对每一行进行分割。内置变量FS,使用-v选项。
awk -v FS='\t' '{}' file
(2)输出分割符:英文原文output field separator,简称OFS。
外部变量不能直接在awk中引用。正确引入方式是 ‘“$a”’ 即外部是一个单引号,内部是一个双引号。
数字文本可以使用 == >= <= != 代表等于大于小于不等于
文字文本可以使用 ~/text/ 代表含有
逻辑性文本 && || ! 代表且或非
内置变量,变量前不需要加 $ 符号,只需要字母即可
外置变量,变量前不仅要加
还需要引号括起
来
′
"
还需要引号括起来 '"
还需要引号括起来′"{variable}"’
a=3
awk '{if ($1=='"$a"') print NR,$0}' txt
awk 'BEGIN{a=10}{if ($3~/a/) a+=$1 fi}END{print a}' txt
" ' $i ' " ???
awk '{if($1=="'$i'")print}'
Linux if
ref: https://blog.youkuaiyun.com/m0_50668851/article/details/115122071
if condition;
then
commands;
else if condition;
then
commands;
else
commands;
fi
算术比较
比较条件通常被房子在封闭的中括号(或者是方括号)内,一定要注意在 [或] 与操作数之间有一个空格。如果忘记了这个空格,shell脚本就会报错。
-gt #大于 相当于 >
-lt #小于 相当于 <
-ge #大于或等于 相当于 >=
-le #小于或等于 相当于 <=
-a 是逻辑与操作,and的意思
-o 是逻辑或的操作,or的意思
[ $var1 -ne 0 -a $var2 -gt 2 ] #使用逻辑与 -a
[ $var1 -ne 0 -o $var2 -gt 2 ] #使用逻辑或 -o
文件系统相关判断
[ -f $file_var ]: 如果给定的变量,包含正常的文件路径,或者文件名,则返回真
[ -d $var ]:如果给定的变量包含目录,则返回真,文件目录存在即为真
[ -e $var ]:如果给定的变量包含的文件存在,则返回真,文件存在即为真
[ -c $var ]:如果给定的变量包含的是一个文件字符设备文件的路径,则返回真
[ -b $var ]:如果给定的变量包含的是一个块设备文件的路径,则返回真
[ -w $var ]:如果给定的变量包含的文件可写,则返回真,也就是说文件具有可写权限
[ -r $var ]:如果给定的变量包含的文件可读,则返回真,也就是说文件具有可读权限
[ -x $var ]: 如果给定的变量包含的文件可执行,返回真,也就是说文件具有可执行的权限
[ -L $var ]:如果给定的变量包含的是一个符号链接,则返回真,也就是说,文件是一个链接文件
考虑下面的例子:
fpath="/etc/passwd"
if [[ -e $fpath ]];
then
echo "File exists"
else
echo "Dose not exists"
fi
字符串比较
进行字符串比较是,最好用双中括号(或者双方括号),因为有时采用单个中括号会产生错误
注意,双中括号是Bash的一个扩展特性。
[[ $str1 = $str2 ]] : 当str1等于str2时,返回真。也就是说,str1与str2包含的文本是一模一样的
注意:在=前后各有一个空格,如果没有空格,那就不是比较关系了,就变成了赋值语句了。
[[ $str1 == $str2 ]] :这是检查字符串是否相同的另一种写法
[[ $str1 != $str2 ]] : 如果str1与str2不相同,返回真
判断字符串是否为空
[[ -z $str ]] : 如果str为空串,则返回真
[[ -n $str ]] :如果str不为空,则返回真
if [[ -n $str1 ]] && [[ -z $str2 ]];
then
commands;
fi
echo 输出带tab
使用-e参数来支持输出类似C的字符串,里面可以加入特殊字符比如换行\n, Tab\t等。
echo -e "Hello\nWorld\nA\tB"
Linux shell 字符串切割
ref:
截取第m个到第n个字符的字符串区间(如m=3,n=6)
export str="123456789"
echo ${str:3:(6-3)}
456
从以上第二个表达式可以看出用法,即: s t r : 3 : ( 6 − 3 ) 。归纳为: {str:3:(6-3)}。归纳为: str:3:(6−3)。归纳为:{str:begin:len},且支持数学表达式,如:6-3。
sra to fq
fastq-dump --split-3 -O ./ $i --gzip
awk求列均值
cat data|awk '{sum+=$1} END {print "Average = ", sum/NR}'
0723
日志文件分析。日志文件某个单词或**某个特殊字符串(字符串当然可以是长度为1的单个字符)**出现多少次。
匹配统计,一般用正则,总结几个统计字符串个数的方法。
方法一:使用 grep 命令
grep -o '字符串' file | wc -l
方法二:使用awk命令进行统计
awk -v RS="@#$j" '{print gsub(/字符串/,"&")}' file
方法三:另一种使用awk命令进行统计的方法
awk '{s+=gsub(/字符串/,"&")}END{print s}' file
awk简介
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
实例
[root@ihh logs]# cat test.txt
userid:121212
userid:232323
userid:3434
username:3434
username:4343
然后统计 userid 在 test.txt 文件里出现多少次,那么根据上面提供的命令,可以这样操作:
[root@ihh logs]# grep -o ‘userid’ test.txt |wc -l
3
[root@ihh logs]# awk -v RS=“@#$j” ‘{print gsub(/userid/,“&”)}’ test.txt
3
[root@ihh logs]# awk ‘{s+=gsub(/userid/,“&”)}END{print s}’ test.txt
3
sed
ref :
https://blog.youkuaiyun.com/jimo_lonely/article/details/115317141
普通替换
sed -I 's///g' file
变量替换"" 双引号解析变量
sed -I "s//$a/g" file
路径替换如变量为pwd结果,自定义分隔符
sed -I "s||$a|g" file
cat tmp | while read i
do
cd $i
cp ../*sh .
#pro=`ls *protein*`
#name=`basename $pro '.faa'`
#echo $name
#cp $pro ${name}_edit.faa
#sed -i 's/\s.*//g' ${name}_edit.faa
PWD=`pwd`
FA=`ls *edit*`
echo $PWD
echo $FA
sed -i "s|PWD|${PWD}|g" *i.sh
sed -i "s/FA/${FA}/g" *.sh
cd ..
done
cat多个文件加换行符
- 添加换行符:如果您需要在合并的文件中添加换行符,可以使用命令如下:
cat file1.txt file2.txt | sed G > merged_file.txt
这个命令使用了sed命令来在文件之间添加换行符。
或者现在每个文件末尾加一行
vi test.txt
sed -i -e '$a\'$'\n''This line was appended at the end.' test.txt
vi test.txt
sed -i -e '$a\'$'\n''' test.txt