awk 实例
?
問:
123 def1 456
345 dxd2 812
123 CKD 563
322 ef4 684
123 dxkds 879
?
?
結果是:
123 def1 1898
345 dxd2 812
322 ef4 684
?
解:
awk '{a[$1]+=$3;if(!b[$1])b[$1]=$2}END{for(i in a)print i,b[i],a[i]}' test1
?
?
問:
如何將
1. a 1
2. b 2
3. c 3
4. a 2
5. c 1
6. b 5
7. a 9
8. b 10
9. c 15
轉換成
1. a 1,2,9
2. b 2,5,10
3. c 3,1,15
解 1 :
awk '{a[$1]=a[$1]?a[$1]","$2:$1" "$2}END {for (i in a) print a[i]}' file
?
解 2 :
cat test.txt |sort -n|xargs -l3|sed -e 's/ [a-z] /,/g'
?
解 3 :
#!/usr/bin/perl -w
use strict;
open FILE_1,"<tmp_1" or die "Can not open file tmp_1:$!";
my %hash;
while(<FILE_1>)
{ chomp;
my ($f,$s) = split;
push @{$hash{$f}},$s;
}
for (keys %hash)
{
print "$_ ",join ",",@{$hash{$_}};
print "/n";
}
?
問:
有一文本,如下:
abc 這是中文 123
456 這也是中文 xyz
?
其中的中文換成問號,結果如下:
?
abc????123
456?????xyz
?
解:
sed 's/[^a-zA-Z0-9]/?/g' file
?
?
?
統計目錄中的最小數字文件。
?
解 1 :
#!/bin/bash
?
cd $1
for filename in `ls`
do
if [ -d $filename ];then
cd $filename
lastfile=`ls | sort | tail -n 1`
echo -e "$PWD/t$lastfile"
cd ..
fi
done
?
解 2 :
find {1..9999} -name "*.jpg" | sort -t/ -k3nr | awk -F'/' '!a[$1$2]++'
?
問:
文件如下
PBCSPOFT0101 0
PBCSPOFT0101 96
PBCSPOFT0102 0
PBCSPOFT0102 6
PBCSPOFT0103 0
PBCSPOFT0103 8
PBCSPOFT0104 0
PBCSPOFT0105 0
PBCSPOFT0106 0
PBCSPOFT0107 0
PBCSPOFT0107 10
PBCSPOFT0108 0
我想刪除第一個字段重復的且第二個字段為 0 的行 , 結果應該如下
PBCSPOFT0101 96
PBCSPOFT0102 6
PBCSPOFT0103 8
PBCSPOFT0104 0
PBCSPOFT0105 0
PBCSPOFT0106 0
PBCSPOFT0107 10
PBCSPOFT0108 0
?
?
?
?
?
?
解 1 :
awk '/pattern/ {print substr($10,1,index($10,"?"))}' access_log |sort |uniq
?
解 2 :
awk '{a[$0]=$0;if((b[$1]=$2)==0) b[$1]=$2; next} END {for (i in a) if ((b[substr(i,0,index(i," ")-1)]==0)||(substr(i,index(i," ")+1) !~/^[ ]+0$/)) print a[i]}' file1
?
?
解 3 :
sort -k1,1 -k2,2nr 數據文件 | awk '!(a[$1]++ && !$2)'
思路是把原文件按照第一字段、第二字段逆序的方式排序
!(a[$1]++ && !$2) 的邏輯就是,排除 第一字段出現過且第二字段為 0
?
解 4 :
awk 'NR==FNR{a[$1]++;next}$2!=0||a[$1]==1' urfile urfile
?
把 abc 目錄下的所有文件打包成以原文件命名加后綴 .tar 文件
?
解 1 :
1. find abc -type f -exec tar -cvf "{}.tar" {} /;
?
解 2 :
2. ls | xargs -I% tar -cvf %.tar %
?
批量文件改名問題
rename .old .new *
mv $files `echo $files|tr .old .new`
rename 's//.java$/.log/' *.java
for file in *.txt;do mv "$file" ${file%.*}.doc ; done
?
?
?
怎么把一列合成一行
例如: 11
22
33
輸出為: 11 22 33
?
解 1 :
awk '{printf "%s ",$0}' file
?
解 2 :
sed ':s N; $!bs; s//n/ /g' file
?
解 3 :
echo -n `cat file`
?
解 3 : ( 根據實際需要調整 )
xargs -n5 < file
?
解 4
awk '{ORS=" "}1' file
?
解 5
paste -s urfile
?
解 6
awk '{printf $0 FS}' file
?
?
##############################################################################################################################
ls -l|awk 'BEGIN {FS=":"} {if (($4==02) && ($7 < 26435)) print "rm" $0}'|rm -f
ls -l |awk -F. '$4=="02"&&$7<"26435" '{print "rm -rf "$NF}'|sh
##############################################################################################################################
?
?
問:比較兩個文件的某幾個字段的問題
file1
111 222 333 444 xxx
eee fff ggg hhh xxx
iii jjj kkk lll xxx
?
file2
111 222 333 444 yyy
555 666 777 888 yyy
111 222 444 333 yyy
555 666 888 999 yyy
aaa bbb ccc ddd yyy
eee fff ggg hhh yyy
iii jjj kkk lll yyy
?
result
555 666 777 888 yyy
111 222 444 333 yyy
555 666 888 999 yyy
aaa bbb ccc ddd yyy
?
解 1 :
awk 'NR==FNR {a[$1$2$3]=$1$2$3} NR>FNR {if (a[$1$2$3]!=$1$2$3) print $0}' file1 file2
?
解 2 :
awk '{NF=NF-1}1' file1.txt|grep -vf- file2.txt
?
問:
如何把多行并作一行
a
b 。
c
d
e 。
f
g
h
i
j 。
k
l 。
多行并作一行,如果不是句號結尾,則并作一行。假設換行符是 /n ,其中句號時中文句號。
> cat file.txt
a b 。
c d e 。
f g h i j 。
k l 。
?
?
解 1 :
awk '$1=$1' RS= 。 ORS= 。 //n file
?
解 2 :
awk '{if(/ 。 $/)print;else printf $0" "}' file
?
解 3 :
sed ':n;/ 。 /!{N;bn};s//n/ /g' urfile
解 4 :
awk '{printf $0" "}/ 。 /{print ""}' file
?
?
解 5 :
awk '$0~/ 。 $/{print;next}{printf $0}' file
?
?
2 個文件比較
?
請教如下問題,由于行數很多,所以效率越高越好
a 文件
23232
454654
7687898
453454
?
b 文件
fdfd 23232 fdfdasd dsds dasdfdfd grthjtjt
fdfd 23232 fdfdasd dsds dasdfdfd grthjtjt
fdfd 7687898 fdfdasd dsds dasdfdfd grthjtjt
fdfd 23232 fdfdasd dsds dasdfdfd grthjtjt
fdfd 23232 fdfdasd dsds dasdfdfd grthjtjt
fdfd 23232 fdfdasd dsds dasdfdfd grthjtjt
fdfd 7687898 fdfdasd dsds dasdfdfd grthjtjt
fdfd 23232 fdfdasd dsds dasdfdfd grthjtjt
fdfd 453454 fdfdasd dsds dasdfdfd grthjtjt
?
輸出:
不含有 a 文件字段的 b 文件的內容
?
解 1 :
grep -vFf file1 file2
?
解 2 :
awk 'NR==FNR{a[$1];next}{if(!($2 in a)) print}' file1 file2
?
問:
一個文件 aa.txt 的內容如下:
[a]
index=1
flag=0
dir=/ddd
[b]
index=2
flag=1
dir=/xxx
[cc]
index=3
flag=0
dir=/dddss
......
我要顯示的內容含有 flag=1 的一段內容,即
[b]
index=2
flag=1
dir=/xxx
解 1 :
grep -A1 -B2 "flag=1" file
解 2 :
awk 'BEGIN{RS=""}/flag=1/' file
$ cat data
src/top/gm
src
src/top
src/top/tk
src/ha
head/jump
head/x
head/jump/jump2
src/a
src/ab
src/a/b
src/abc
src/ab/c
我想得到 data 文件里面獨一無二并且最深的路徑列表即
src/top/gm
src/top/tk
src/ha
head/x
head/jump/jump2
src/ab
src/a/b
src/abc
src/ab/c
解 1 :
sort data|sed 'N;/^/(./+/)/n/1/!P;D' data
解 2 :
sort -r 數據文件 | awk 'NR==1{a=$0}NR>1&&!index(a,$0"/"){print a;a=$0}END{print a}'
有一些文件,如下:
20090102.ddd_S004_a_01.txt
20090102.ddd_S004_a_02.txt
20090102.ddd_S004_d_03.txt
要將文件名中的 S004 批量替換為 S005 ,用 shell 可以實現,用一個命令能否實現?
解 1 :
for i in *.txt;do mv $i $(sed "s/S004/S005/" <<<$i);done
解 2 :
rename S004 S005 20090102.ddd*
解 3 :
for i in `ls -l| awk -F_ '$2=="S004"'|awk '{ print $NF }'`;do mv $i $(echo $i|sed 's/S004/S005/');done
######################################################################################################################################
'bash -c "scp -r /var/www/hddatabase/_sys/hadoop/0.18.3/* dachuan@202.114.10.199:~/hd_0.18.3_20100519150256/" '
######################################################################################################################################
?
?
總結
- 上一篇: 奥维云网:石头G10S年销超26万台 全
- 下一篇: 汽水音乐怎么挂在抖音里面