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/" '

######################################################################################################################################

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值