awk中引用shell變量執行替換的腳本


遇到問題:
現在有兩個腳本,我想
將file1中的內容按file2來匹配
[root@154 home]# cat file1
3-1-1 POTV=1,POTA=0,POTP=2
1-4-76 POTV=1,POTA=0,POTP=1
2-1-2 POTV=1,POTA=1,POTP=1
3-1-4 POTV=1,POTA=1,POTP=2
4-1-5 POTV=1,POTA=1,POTP=2
7-1-2 POTV=1,POTA=1,POTP=2
3-1-10 POTV=1,POTA=1,POTP=2
1-1-1 POTV=1,POTA=2,POTP=0

 

[root@154 home]# cat file2
1-1-1
2-1-2
2-1-3
3-1-4
4-1-5

  

相當於grep的精確匹配,不過是用awk實現的
grep -w '1-1-1' file1
實現用for in循環取值,賦予變量
 
寫了一個替換思路用for in循環將匹配內容變為變量,然后匹配替換
for i in `cat file2`
do
awk  '$1==''"'$i'"''{print $0}' file1 >> urfile
done
 
awk  '$1=='   '"'   $i   '"'    '{print $0}'   file1
這段中單引號是脫義的作用
在awk中精確匹配字符,需要將字符用雙引號引用: 即 awk '$1=="1-1-1"{print $0}' test 所以對傳遞參數要用單引號將雙引號脫義讓awk識別
單引號成對出現是按就近原則來的

  

這里需要注意的是,這里引用的'$1=='   '"'   $i   '"'    '{print $0}'里面不能有空格,不然會發生語法錯誤

(猜想大概是因為IFS分段原因,awk被分成了幾段話,造成語法錯誤)

[root@154 home]# cat aemployee.txt 
101 John Doe,CEO
102 Jason Smith,IT Manager
103 Raj Reddy,Sysadmin
104 Anand Ram,Developer
105 Jane Miller,Sales Manager
[root@154 home]# awk '$1==''"'101'"''{print $0}' aemployee.txt 
101 John Doe,CEO
[root@154 home]# awk '$1==' '"'101'"''{print $0}' aemployee.txt 
awk: cmd. line:1: $1==
awk: cmd. line:1:     ^ unexpected newline or end of string

  這里就能看出來,應該跟我猜的一樣,如果有不對,請大神指點

2017/07/01更新:

之前的方法太蠢了,改進下,因為之前實驗失敗,所以認為這樣是不行的,不過發現好像是之前實驗錯誤:
awk '$1=="'$i'"{print $0}' file1 >> urfile

===================================================================

新需求

            其中file1只有270行,
             file2有345行,
             file1的第一列內容都包含在file2中
             這是兩個文件的關系
要求:
      我想以file2為樣本,將file1第一列匹配file2行進行替換

即file2的第一行為
1-1-1
在file1中存在
1-1-1 POTV=1,POTA=2,POTP=0
然后將file2中內容替換為file1中該行內容(或者添加file1中第二列內容)
即變成以下樣子
1-1-1 POTV=1,POTA=2,POTP=0
1-1-2
1-1-3
1-1-4
1-1-5

 

-------------------------------------------------------------------------

自己編了一個腳本,畢竟沒有基礎,大神莫笑

腳本1

#!/bin/bash
 
 
for i in `cat yrsd`
do
        s=`awk  '$1==''"'$i'"''{print $0}' test`
        if [ "$s" == "" ];
                then echo "$i" >>1
        else
                echo "$s" >>1
        fi
done

 腳本2

	#!/bin/bash


	for i in `cat yrsd`
	do
		echo $i
		if [ -z "$(awk  '$1==''"'$i'"''{print $0}' test)" ];
			then echo "$i" >>1
		else
			echo "$(awk  '$1==''"'$i'"''{print $0}' test)" >>1
		fi
	done

  

 
既然已經實現了awk替換,那加個判斷就能搞定
另外,大神給的方法
 
awk 'FNR==NR{a[$1]=$2;next}{$2=a[$1];print}' file1 file2

 

  解釋一下這個吧,這是使用了awk的內置變量NF和FNR,利用這兩個變量,結合數組,先將需要替換的內容組合放到數組里,供匹配使用;

  再使用了next這個內置函數模塊,這樣的話就可以達到先將內容放到數組里,然后執行匹配替換。

  這里還有一個精彩的地方,在file2文件里,並沒有$2這欄,而在執行的時候使用了不存在的$2;

  開始我也疑惑,后來想到,這是一個類似於賦值的方法,原本不存在$2被賦值為替換的內容;

  打印該列,print后不接參數等同於print $0

 
使用awk的FNR與NR的區別,利用數組,一條命令搞定
這里的知識點還是挺多的,看我這篇分析吧,講的更詳細


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM