2014-02-14 46 views
-2

腳本應該讀取路徑中的每個文件並替換每個單行中的字符串。如何在同一路徑中迭代10個差異輸入文件名時創建臨時文件和mv替換 請諮詢需要Shell腳本-awk選項幫助

的SunOS 5.10

FILES=/export/home/*.txt 
for f in $FILES 
do 
echo "Processing $f file..." 
cat $f | awk 'BEGIN {FS="|"; OFS="|"} {$8=substr($8, 1, 6)"XXXXXXXXXX\""; print}' 
done 

輸入文件

"2013-04-30"|"X"|"0000628"|"15000231"|"1999-12-05"|"ST"|"2455525445552000"|"1111-11-11"|75.00|"XXE11111"|"224425" 
"2013-04-30"|"Y"|"0000928"|"95000232"|"1999-12-05"|"VT"|"2455525445552000"|"1111-11-11"|95.00|"VVE11111"|"224425" 

輸出文件

"2013-04-30"|"X"|"0000628"|"15000231"|"1999-12-05"|"ST"|"245552xxxxxxxxxx"|"1111-11-11"|75.00|"XXE11111"|"224425" 
"2013-04-30"|"Y"|"0000928"|"95000232"|"1999-12-05"|"VT"|"245552xxxxxxxxxx"|"1111-11-11"|95.00|"VVE11111"|"224425" 

不知道如何使用這個

cat $f | awk 'BEGIN {FS="|"; OFS="|"} {$8=substr($8, 1, 6)"XXXXXXXXXX\""; print}' $f > tmp.txt && mv tmp.txt $f 
+0

當您執行'FILES =/export/home/*。txt'時,您實際上是在存儲glob模式本身,而不是文件名列表。最好不要這樣做,或者使用一個shell來存儲結果作爲數組。 –

+0

fedorqui-pls以更好的方式編輯我需要的答案 – Sen

+0

'cat | awk ...'可以更好地寫成'awk ... '。 – twalberg

回答

0

爲了實現這似乎是你期望的最終結果,你可以使用版,而不是AWK

FILES=/export/home/*.txt 
for f in $FILES; do 
    echo "Processing ${f} file..." 
    ed "${f}" <<EOF 
% s/\([0-9]\{6\}\)[0-9]\{10\}/\1xxxxxxxxxx/ 
w 
q 
EOF 
done 

這需要更少的步驟(即命令調用),因爲您沒有創建臨時文件並將其移動。相反,您正在使用所需的更改編輯文件,然後關閉它。

 
% means "operate on every line" (don't worry about lines that don't match) 
s means "perform a substitution" -- /[pattern]/[replacement]/ 
w means write 
q means quit 
EOF closes out the "here document" 

希望有所幫助。

編輯注:Charles Duffy指出,版$ {F}將失敗的文件名包含空格和版「$ {F}」不會從特定的缺乏症。這是真的。 但是,上面的循環的 可能會拆分文件名中的任何空格。您可以設置IFSIFS='\n')以解決KSH,BASH,MKSH,ASH和DASH上的此限制。在ZSH中(取決於你的版本),你可能需要設置SH_WORD_SPLIT。作爲替代,你可以從一個循環更改爲,而循環與閱讀

FILES=/export/home/*.txt 
ls ${FILES} | while read f; do 
    echo "Processing ${f} file..." 
    ed "${f}" <<-EOF 
% s/\([0-9]\{6\}\)[0-9]\{10\}/\1xxxxxxxxxx/ 
w 
q 
EOF 
done 

編輯注:我上面的災區錯誤言論,但保留歷史的目的。查看Charles Duffy的評論(下文)以作澄清。

+0

'ed「$ f」' - 沒有引號,這將無法正確使用空格的文件名。 –

+0

@CharlesDuffy true。請參閱編輯注意。謝謝。 –

+0

...錯。使用'ls'將自己的平臺特定的問題添加到不可打印的文件名中,並且使用不帶'-r'或清除的'IFS'的'read'擴展反斜槓序列並清除尾隨的空白。使用'printf'%s \ 0'$ FILES |更安全而IFS =''讀取-r -d''f',如果由於某種原因你不能做正確的事情並且在'/ export/home/* .txt中使用'f' –