awk可以處理這個嗎?使用awk將含有單引號的字母括起來
輸入
Neil,23,01-Jan-1990
25,Reena,19900203
輸出
'Neil',23,'01-Jan-1990'
25,'Reena',19900203
awk可以處理這個嗎?使用awk將含有單引號的字母括起來
輸入
Neil,23,01-Jan-1990
25,Reena,19900203
輸出
'Neil',23,'01-Jan-1990'
25,'Reena',19900203
你可以使用這個腳本:
script.awk
BEGIN { OFS=FS="," }
{ for(i= 1; i<=NF; i++) {
if(!match($i, /^[0-9]+$/)) $i = "'" $i "'"
}
print
}
並像這樣運行它:awk -f script.awk yourfile
。
說明
,
。/^[0-9]+$/
):不正確的是我第一次嘗試
sed -r 's/([^,]*[a-zA-Z]+[^,]*)(,{0,1})/"\1"\2/g' inputfile
@Sundeep一聲優秀的評論:我需要單引號,它可以更短:
我試圖匹配包括行末尾,
,造成一些複雜的匹配。您可以在分隔符之間進行匹配,確保某處存在字母字符。
sed 's/[^,]*[a-zA-Z][^,]*/\x27&\x27/g' inputfile
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
- 單引號字符'
OP想單引號,不是雙...這可以簡化爲'sed的「S/[^,] *的八進制代碼[a-zA-Z] [^,] */\ x27&\ x27/g'' – Sundeep
對於所有seds中的單引號是'\ x27'?至少不是awk,因爲它依賴於未定義的行爲,請參閱http://awk.freeshell.org/PrintASingleQuote,但是'\ 047'在sed中完全不起作用,因爲'\ 0'被解釋爲與'&'相同,所以我總是依靠'''''在sed中單引號出於這個原因。 –
@EdMorton至少對於'gnu sed'它是強健的... https://www.gnu.org/software/sed/manual/sed.html#Escapes語法是'\ xxx生成或匹配一個字符的十六進制ASCII值爲xx',八進制需要使用'\ o047' – Sundeep