2017-05-27 57 views

回答

0

你可以使用這個腳本:

script.awk

BEGIN { OFS=FS="," } 

{ for(i= 1; i<=NF; i++) { 
    if(!match($i, /^[0-9]+$/)) $i = "'" $i "'" 
    } 
    print 
} 

並像這樣運行它:awk -f script.awk yourfile

說明

  • 第一行設置的輸入和輸出Fieldseparators到,
  • 循環測試每個領域,無論是隻包含數字(/^[0-9]+$/):
    如果不是字段加上引號
1

不正確的是我第一次嘗試

sed -r 's/([^,]*[a-zA-Z]+[^,]*)(,{0,1})/"\1"\2/g' inputfile 

@Sundeep一聲優秀的評論:我需要單引號,它可以更短:
我試圖匹配包括行末尾,,造成一些複雜的匹配。您可以在分隔符之間進行匹配,確保某處存在字母字符。

sed 's/[^,]*[a-zA-Z][^,]*/\x27&\x27/g' inputfile 
+1

OP想單引號,不是雙...這可以簡化爲'sed的「S/[^,] *的八進制代碼[a-zA-Z] [^,] */\ x27&\ x27/g'' – Sundeep

+0

對於所有seds中的單引號是'\ x27'?至少不是awk,因爲它依賴於未定義的行爲,請參閱http://awk.freeshell.org/PrintASingleQuote,但是'\ 047'在sed中完全不起作用,因爲'\ 0'被解釋爲與'&'相同,所以我總是依靠'''''在sed中單引號出於這個原因。 –

+0

@EdMorton至少對於'gnu sed'它是強健的... https://www.gnu.org/software/sed/manual/sed.html#Escapes語法是'\ xxx生成或匹配一個字符的十六進制ASCII值爲xx',八進制需要使用'\ o047' – Sundeep

1

AWK方法:

awk -F, '{for(i=1;i<=NF;i++) if($i~/[[:alpha:]]/) $i="\047"$i"\047"}1' OFS="," file 

輸出:

'Neil',23,'01-Jan-1990' 
25,'Reena',19900203 

  • - 如果字段包含字母字符

  • \047 - 單引號字符'

相關問題