正则需要转义字符:'$', '(', ')', '*', '+', '.', '[', ']', '?', '\', '^', '{', '}', '|'
awk -F '|' '{if(NF==3) print $1 $2 }'
1.表示:以"|"分割,分割后字段等于3的,输出第一、二字段; 2.NF表示切分后的字段个数
例如:
awk -F '|' '{if(NF==3) print $1 $2 $3 }'
awk -F '|' '{if($1 == 2 && $2 != 1) print $1 $2 $3 }'
awk -v OFS='|' '{$1=$1; print}'
其中,$1=$1,表示行的内容发生变化后OFS就生效了,不然OFS不给生效
普通版
awk -vOFS="\t" '{$1=$1}1' inputfile
循环版
awk '{for(i=0;i++ inputfile
awk -F '|' '{if ($3 == 123) print } ' | sort -k 5 -t "|"
awk -F '|' '{if($1 >= 10) print $2}'|sort -u|wc -l
cat file.txt |awk -F '|' '{print $4}'|grep '^[0-9]\{2,3\}'|wc -l
grep '^[0-9]\{2,3\}'|egrep -e "226" |grep -e ":"
cat file.txt | grep "^[^A]"
cat file.txt|egrep -w -e "54043"
-w --word-regexp #只显示全字符合的列。
-x --line-regexp #只显示全列符合的列。
cut -b 3
#声明 字典结构
declare -A dicA
#字典结构
dicA=([neimenggu]="内蒙古自治区" [guangdong]="广东省" [hainan]="海南省" [qinghai]="青海省" [gansu]="甘肃省" [jilin]="吉林省" [beijing]="北京市" [chongqing]="重庆市" [ningxia]="宁夏回族自治区" [hubei]="湖北省" [hunan]="湖南省" [anhui]="安徽省" [shanxisheng]="陕西省" [guangxi]="广西壮族自治区" [yunnan]="云南省" [shanghai]="上海市" [jiangxi]="江西省" [shanxi]="山西省" [fujian]="福建省" [guizhou]="贵州省" [hebei]="河北省" [heilongjiang]="黑龙江省" [henan]="河南省" [jiangsu]="江苏省" [liaoning]="辽宁省" [shandong]="山东省" [sichuan]="四川省" [tianjin]="天津市" [xinjiang]="新疆维吾尔自治区" [xizang]="西藏自治区" [zhejiang]="浙江省")
day="01 10 19 28"
#身份拼音列表
es="anhui beijing chongqing fujian gansu guangdong guangxi guizhou hainan hebei heilongjiang henan hubei hunan jiangsu jiangxi jilin liaoning neimenggu ningxia qinghai shandong shanghai shanxi shanxisheng sichuan tianjin xinjiang xizang yunnan zhejiang"
for pro in $es
do
{
echo " ${dicA[ "${pro}" ] } is running "
for das in $day
do
{
#核心但愿
value=`cat ./$date${das}_${dicA["${pro}"]}.txt |awk -F '|' '{print $4}'|grep '^[0-9]\{2,3\}'|wc -l`
all=`cat ./$date${das}_${dicA["${pro}"]}.txt |wc -l`
per=`awk 'BEGIN{printf "%.1f%%\n",('$value'/'$all')*100}'`
echo "${dicA["${pro}"]}, $date${das},${all},${value},${per}" >> 19.txt
}
done
}
done
a=38
b=99
percent_1=$(printf "%d%%" $((a*100/b)))
# 或者
percent_2=`awk 'BEGIN{printf "%.1f%%\n",('$a'/'$b')*100}'`
# 保留1位小数,四舍五入
echo $percent_1
echo $percent_2
1 percent_1=38%
2 percent_2=38.4%
wang|2|9
wang|2|4
zhang|2|l
hanna|3|2
zhang|2|3
应用:
#统计某一列
less result.txt | awk -F '|' '{k=$12; if(k in X){X[k] ++} else{X[k] = 1} } END{for(k in X){print k"|"X[k]}}' > devicePV.txt
第12列 相同的累加 找不到话就=1
#统计两列组合种类个数
less result.txt | awk -F '|' '{k=$2"|"$3; if(k in X){X[k] ++} else{X[k] = 1} } END{for(k in X){print k"|"X[k]}}' > test.txt
把2、3列组合在一起统计
结果:
wang|2
zhang|2
hanna|1
cat devicePV.txt |awk -F '|' '{sum+=$2} END {print sum}'
for line in `cat phone.txt`;do grep $line `hdfs dfs -text /user/JiuQianProject/yunhe/after_recovery/*/final/huixitong/day/mid/*/011/yhbank/*`;done >> pv.txt
....#输出删除后的样子,但不修改源文件
sed '3,$d' filename.txt
#修改源文件
sed -i '4,$d' filename.txt
sed -i '1d' se_beijing.txt
sed 's/[ \t]*$//' data.txt
中文省份变英文,首先你要有中文
sed 's/|安徽|/|anhui|/g' | sed 's/|北京|/|beijing|/g' | sed 's/|重庆|/|chongqing|/g' | sed 's/|福建|/|fujian|/g' | sed 's/|甘肃|/|gansu|/g'| sed 's/|广东|/|guangdong|/g'| sed 's/|广西|/|guangxi|/g'| sed 's/|贵州|/|guizhou|/g'| sed 's/|海南|/|hainan|/g'| sed 's/|河北|/|hebei|/g'| sed 's/|黑龙江|/|heilongjiang|/g'| sed 's/|河南|/|henan|/g'| sed 's/|湖北|/|hubei|/g'| sed 's/|湖南|/|hunan|/g'| sed 's/|江苏|/|jiangsu|/g'| sed 's/|江西|/|jiangxi|/g'| sed 's/|吉林|/|jilin|/g'| sed 's/|辽宁|/|liaoning|/g'| sed 's/|内蒙古|/|neimenggu|/g'| sed 's/|宁夏|/|ningxia|/g'| sed 's/|青海|/|qinghai|/g'| sed 's/|山东|/|shandong|/g'| sed 's/|上海|/|shanghai|/g'| sed 's/|山西|/|shanxi|/g'| sed 's/|陕西|/|shanxisheng|/g'| sed 's/|四川|/|sichuan|/g'| sed 's/|天津|/|tianjin|/g'| sed 's/|新疆|/|xinjiang|/g'| sed 's/|西藏|/|xizang|/g'| sed 's/|云南|/|yunnan|/g'| sed 's/|浙江|/|zhejiang|/g'
怎样输出一个文件里所有的奇数行或所有的偶数行的命令求解释。功能实现了但是不懂意思
1.awk 'NR%2==0' file
2.sed -n '1,$n;p' file
3.sed -n '1,$p;n' file
4.奇数行:sed '2~2d' file
5.偶数行:sed '1~2d' file
如果文件中出现了则文件出现了爆头,需要进行如下处理:
[Windows] dos2unix.exe filename
[Unix] dos2unix filename
1.管理员权限运行cmd;
2.执行:netsh interface ipv4 set subinterface "以太网" mtu=1400 store=persistent;
以太网,为本地连接
方法一:利用grep
grep -v '^\s*$' test.txt
注:-v表示将匹配的结果进行反转,正则表达式匹配空行。(空行可包括空格符制表符等空白字符)
方法二:利用sed
sed '/^\s*$/d' test.txt
注:d代表删除该行
方法三:利用awk
awk NF test.txt
注:NF代表当前行的字段数,空行的话字段数为0,被awk解释为假,因此不进行输出。
以上三种方式均可处理包含空白字符(空格符,制表符等)的空行。
方法四:若空行均由’\n'造成,则还可以利用tr命令去除空行
tr -s '\n' < test.txt
注:-s代表将多个连续的字符压缩成一个字符,这里是将多个‘\n'压缩成一个'\n',达到去除空行的效果。
if [ ! -n "$word" ] ;then
echo "you have not input a word!"
else
echo "the word you input is $word"
fi
基本的if条件命令选项有:
-eq —比较两个参数是否相等(例如,if [ 2 –eq 5 ])
-ne —比较两个参数是否不相等
-lt —参数1是否小于参数2
-le —参数1是否小于等于参数2
-gt —参数1是否大于参数2
-ge —参数1是否大于等于参数2
-f — 检查某文件是否存在(例如,if [ -f "filename" ])
-d — 检查目录是否存在
if [ ! -d "$folder" ] ; then
mkdir "$folder"
fi
#!/bin/bash
ls liqiu > /tmp/error 2>&1 #使用 " 2>&1" 把标准错误 stderr 重定向到标准输出 stdout ;
echo $? #捕获上一条命令的输出 (if 0 正常 else 错误)
ls -l > /tmp/log
echo $?
shell脚本报错:"[: =: unary operator expected"
转载 2011年06月23日 22:52:00 标签:shell /脚本 108808
shell脚本报错:"[: =: unary operator expected"
在匹配字符串相等时,我用了类似这样的语句:
if [ $STATUS == "OK" ]; then
echo "OK"
fi
在运行时出现了 [: =: unary operator expected 的错误,就一直找不到原因,尝试了删除等号两侧的空格和括号里的空格都不管用,最后baidu了一下,才找到原因。把语句改成这样就不会出错了.
if [[ $STATUS = "OK" ]];
then
echo "OK"
fi
究其原因,是因为如果变量STATUS值为空,那么就成了 [ = "OK"] ,显然 [ 和 "OK" 不相等并且缺少了 [ 符号,所以报了这样的错误。当然不总是出错,如果变量STATUS值不为空,程序就正常了,所以这样的错误还是很隐蔽的。
或者用下面的方法也能避免这种错 误:if [ "$STATUS"x == "OK"x ]; then echo
"OK"fi。当然,x也可以是其他字符。顺便提一点,shell中有没有双引号在很多情况下是一致的。
shell中map的使用和遍历
原创 2015年01月20日 16:54:42 12920
定义一个空map
[plain] view plain copy
declare -A map=()
定义时初始化map
[plain] view plain copy
declare -A map=(["100"]="1" ["200"]="2")
输出所有key
[plain] view plain copy
echo ${!map[@]}
输出所有value
[plain] view plain copy
echo ${map[@]}
添加值
[plain] view plain copy
map["300"]="3"
输出key对应的值
[plain] view plain copy
echo ${map["100"]}
遍历map
[plain] view plain copy
for key in ${!map[@]}
do
echo ${map[$key]}
done