天天看點

用awk數組處理兩個檔案的例子

收了本論壇的三個例子

QUOTE:

1、用某一檔案的一個域替換另一個檔案中的的特定域?

http://bbs.chinaunix.net/forum/viewtopic.php?t=500015

檔案passwd:

s2002408030068:x:527:527::/home/dz02/s2002408030068:/bin/pw

s2002408032819:x:528:528::/home/dz02/s2002408032819:/bin/pw

s2002408032823:x:529:529::/home/dz02/s2002408032823:/bin/pw

檔案shadow:

s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:12676:0:99999:7:::

s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:12676:0:99999:7:::

s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:12676:0:99999:7:::

用shadow檔案中的密文部分替換passwd中的"x",生一個新passwd檔案,如下所示

s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:527:527::/home/dz02/s2002408030068:/bin/pw

s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:528:528::/home/dz02/s2002408032819:/bin/pw

s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:529:529::/home/dz02/s2002408032823:/bin/pw

CODE:

awk 'BEGIN{OFS=FS=":"} NR==FNR{a[$1]=$2}NR>FNR{$2=a[$1];print}' shadow passwd

NR==FNR,第一個檔案shadow,以$1為下标,将$2的值賦給數組a

NR>FNR,第二個檔案passwd,将檔案shadow$2的值指派給檔案passwd

2、

cat file1:

0011AAA 200.00 20050321

0012BBB 300.00 20050621

0013DDD 400.00 20050622

0014FFF 500.00 20050401

cat file2:

I0011  11111

I0012  22222

I0014  55555

I0013  66666

規則:比較 file1的1-4字元 和 file2的2-5 字元,如果相同,将file2 的第二列 與 file1 合并 file3

0011AAA 200.00 20050321 11111

0012BBB 300.00 20050621 22222

0013DDD 400.00 20050622 66666

0014FFF 500.00 20050401 55555

awk  'NR==FNR{a[substr($1,2,5)]=$2}NR>FNR&&a[b=substr($1,1,4)]{print $0, a[b]}' file2 file1 >file3

3、如果檔案a中包含檔案b,則将檔案b的記錄列印出來

http://bbs.chinaunix.net/forum/viewtopic.php?t=520411

檔案a:

10/05766798607,11/20050325191329,29/0.1,14/05766798607

10/05767158557,11/20050325191329,29/0.08,14/05767158557

檔案b:

05766798607

05766798608

05766798609

通過檔案a和檔案b對比,導出這樣的檔案出來.

a

wk -F'[/,]' 'ARGIND==1{a[$0]}ARGIND>1{($2 in a);print $0}' b a

awk -F'[/,]' 'NR==FNR{a[$0]}NR>FNR{($2 in a);print $0}' b a

4、

file1檔案内容

   1     0.5  100

                                 10  15    36.5

file2檔案

        50   10    9

                                 3.2   1     5

将兩個檔案合成一個檔案如:

   51     10.5    109

                                                              13.2   16      41.5

就是對應的字段進行相加以後的數字。

awk '{for (i=1;i=$i

getline for (i=1;i" ";

printf $NF+a[NF] "\n"}' file1

awk '{for (i=1;i

5、

檔案a

1000 北京市 地級 北京市 北京市

1100 天津市 地級 天津市 天津市

1210 石家莊市 地級 石家莊市 河北省

1210 晉州市 縣級 石家莊市 河北省

1243 灤縣 縣級 唐山市 河北省

1244 灤南縣 縣級 唐山市 河北省

b檔案:

110000,北京市

120000,天津市

130000,河北省

130131,平山縣

130132,元氏縣

這樣的字段

a中第二列在b中可能有可能沒有,需要把有的比對起來生成新的一列:要包含a和b的第一列。沒有比對的按照b原來的格式進行輸出。

awk 'BEGIN{FS="[ |,]";OFS=","}NRFNR{print $1,$2,a[$2]}' a b

6、

file1的第一列與file2的第3列相同,

file1的第二列與file2的第4列的3-5位相同,

file1的第三列與file2的最後一列相同,

# cat file1

AAA  001  1000.00

BBB  001  2000.00

DDD  002  4000.00

EEE  002  5000.00

FFF  003  6000.00

# cat file2

01 1111  AAA  WW001  $$$$  1000.00

02 2222  BBB  GG001  %%%%  2000.00

03 3333  CCC  JJ001  ****  3000.00

04 4444  DDD  FF002  &&&&  4000.00

05 5555  EEE  RR002  @@@@  5000.00

06 666   FFF  UU003  JJJJ  6000.00

07 777   III  II005  PPPP  7000.00

08 8888  TTT  TT008  TTTT  8000.00

# awk 'NR> NR>FNR{b=substr($4,3);c=$3"x"b"x"$6;if(c==a[$3]) print}' file1 file2

閱讀(2143) | 評論(1) | 轉發(1) |