2011-03-18 71 views
1

我在我的shell腳本中使用了下面的awk語句。awk意外改變文本

#!/bin/sh 
# read file line by line 
file="/pdump/country.000000.txt" 
while read line 
do 
mycol=`echo $line | awk -F"," '{print $2}'` 
mycol_new=`echo $mycol | tr "[:lower:]" [:upper:]` 
echo $line | awk -v var="$mycol_new" -F"," '{print $1 "," var "," $3 "," $4 "," $5 "," $6 "," $7 "," $8}' 
done < $file 

它按預期工作。

唯一的問題是,如果原始文本是\ N(斜線N)在任何其他列中,例如, $ 4或$ 7,然後它變成N(沒有斜槓)。 如何保留原始值而僅替換第二列。

+0

反斜槓的丟失必須發生在其他地方。如果'echo $ line'沒有'awk'命令,你會看到反斜線N嗎? – 2011-03-18 04:37:17

+0

你是對的。即使我使用echo「$ line」,它也會顯示沒有\ N的行。我如何解決這個問題。我應該爲這個問題使用什麼標籤? – shantanuo 2011-03-18 04:44:02

+0

http://stackoverflow.com/questions/5338225/replacing-second-column-using-shell-script#我正在使用while循環來讀取文件行 – shantanuo 2011-03-18 04:47:03

回答

2

您需要使用read-r選項在while循環:

while read -r line 

,保留反斜槓輸入。應該幾乎總是使用這個選項。讓它成爲一種習慣。

0

如果awk不是公認的轉義序列之一,awk會去掉反斜槓。所以,如果這是\ n時,awk會認定它爲換行符,但是\ N被簡單地理解爲N.更多細節here

0

如果我看了你的代碼正確,你想:

  1. 讀取輸入逗號分隔值(CSV)文件
  2. 將第二個字段更改爲大寫
  3. 打印結果。

如果是這種情況,請直接使用AWK。保存下列到toupper_second_field.awk:

BEGIN { FS = ","; OFS="," } 
{ $2 = toupper($2); print } 

第一行設置的字段分隔爲兩個輸入(FS)和輸出(OFS)到逗號。第二個將字段#2轉換爲大寫,然後打印。調用它:

awk -f toupper_second_field.awk /pdump/country.000000.txt 

邏輯非常簡單,您不必擔心反斜槓。