2016-09-20 123 views
-1

我在ksh腳本中有很多函數(它使用gawk很多),它對文件進行了許多計算,文件被管道刪除。 但現在我的源文件改變。現在,每個文件中的字段的內容如下雙引號的。 另外,我有修剪如果任何首尾空格或製表符。如何刪除前導和尾隨「,刪除每行中的前導和尾隨空格ksh

Old_Myfile.txt 

Name|Designation|emlid 
Alex|Software Design Engg|E0023 
Corner|SDE|E0056 

New_Myfile.txt 

"Name"|"Designation"|"emlid" 
"Alex"|"Software Design Engg"|" E0023" 
"  Corner "|"  SDE"|" E0056 " 

請建議的方式,這將是與我已寫的腳本兼容。

+1

HuMMM,哪裏是你的代碼? –

+0

你可以引用的字段是否包含'|'s?例如'「Alex」|「Software | Design | Engg」|「E0023」'。 –

回答

0

此腳本可能會過度設計以滿足您的需求,但它會在每個字段上單獨運行(for循環內),以防您需要稍後添加其他邏輯。

BEGIN{ 
    FS="|"; 
    OFS="|"; 
} 

{ 
    for(i=1; i<=NF; i++){ 
    gsub(/(^"[ ]*|[ ]*"$)/, "", $i); 

    if (i == NF) { 
     printf("%s\n", $i); 
    } 
    else { 
     printf("%s%s", $i, OFS); 
    } 
    } 
} 

下面是輸出

$ awk -f /tmp/script.awk </tmp/input.txt 
Name|Designation|emlid 
Alex|Software Design Engg|E0023 
Corner|SDE|E0056 
+0

gsub(/(^「[] * | [] *」$)/,「」,$ i); – user6613676

+0

我已經使用了這個解決方案。 gsub(/(^「[] * | [] *」$)/,「」,$ i); 這給出了下面的結果: 如果場地兩邊都有空間,它只能修整一邊,即領先空間。我必須修改腳本: gawk -F「|」 '{OFS =「|」 (i = 1; i <= NF; i ++){(i = 1; i <= NF; i ++) sub(/^\「/,」「,$ i); } {for(i = 1; i <= NF; i ++) sub(/^[[:space:]] + | [[:space:]] + $ /,「」,$ i) {print $ 0}'$ 1 爲什麼or(|)選項不能按預期工作? – user6613676

+0

你爲什麼把'gsub'改成'sub'? 'gsub'將「全局」替換每一行的每一行。這比擁有兩個每個執行「次」操作的for循環更可取。此外,'gawk -F「|」'和'gawk'BEGIN {FS =「|」...「'沒有區別。只是指出,如果你不知道。至於你的正則表達式,可以用包裝提供的正則表達式來包裝它。另外我不確定你爲什麼需要修改腳本。帖子中的輸出是你期望的輸出,對嗎?缺少哪些邊緣案例?謹慎提供這些? – wpcarro

2

sed

$ sed 's/ *" *//g' file 

Name|Designation|emlid 
Alex|Software Design Engg|E0023 
Corner|SDE|E0056 

可以在awk腳本以及合併沒有這個額外的步驟。

+1

thx,刪除'-r'。 – karakfa

0

如果您引用字段不能包含|當時的現有awk腳本中添加此作爲第一行:

awk ' 
{ gsub(/[[:space:]]*"[[:space:]]*/,"") } 
<existing script> 
' 
相關問題