问:
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/" '
######################################################################################################################################