awk 实例
?
問:
123 def1 456
345 dxd2 812
123 CKD 563
322 ef4 684
123 dxkds 879
?
?
結(jié)果是:
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
轉(zhuǎn)換成
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
?
其中的中文換成問號,結(jié)果如下:
?
abc????123
456?????xyz
?
解:
sed 's/[^a-zA-Z0-9]/?/g' file
?
?
?
統(tǒng)計(jì)目錄中的最小數(shù)字文件。
?
解 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
我想刪除第一個字段重復(fù)的且第二個字段為 0 的行 , 結(jié)果應(yīng)該如下
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 數(shù)據(jù)文件 | awk '!(a[$1]++ && !$2)'
思路是把原文件按照第一字段、第二字段逆序的方式排序
!(a[$1]++ && !$2) 的邏輯就是,排除 第一字段出現(xiàn)過且第二字段為 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 : ( 根據(jù)實(shí)際需要調(diào)整 )
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 。
多行并作一行,如果不是句號結(jié)尾,則并作一行。假設(shè)換行符是 /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 個文件比較
?
請教如下問題,由于行數(shù)很多,所以效率越高越好
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 文件的內(nèi)容
?
解 1 :
grep -vFf file1 file2
?
解 2 :
awk 'NR==FNR{a[$1];next}{if(!($2 in a)) print}' file1 file2
?
問:
一個文件 aa.txt 的內(nèi)容如下:
[a]
index=1
flag=0
dir=/ddd
[b]
index=2
flag=1
dir=/xxx
[cc]
index=3
flag=0
dir=/dddss
......
我要顯示的內(nèi)容含有 flag=1 的一段內(nèi)容,即
[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 文件里面獨(dú)一無二并且最深的路徑列表即
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 數(shù)據(jù)文件 | 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 可以實(shí)現(xiàn),用一個命令能否實(shí)現(xiàn)?
解 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/" '
######################################################################################################################################
?
?
總結(jié)
- 上一篇: 奥维云网:石头G10S年销超26万台 全
- 下一篇: wien2k 2009 编译方法