2016-09-20 8 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 "|" Программное обеспечение | Дизайн | Engg "|" E0023 "'. –

ответ

0

Этот сценарий может быть перепроектирован для того, что вам нужно, но он будет работать на каждом поле отдельно (внутри цикла), если вам нужно добавить дополнительную логику позднее.

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 ++) sub (/ \ "$ /," ", $ i); } {for (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' будет« глобально »заменять каждое событие для каждой строки. Это предпочтительнее, если у каждого есть две петли, каждая из которых выполняет операцию 'sub'. Кроме того, нет разницы между 'gawk -F '|" 'и' gawk' BEGIN {FS = "|" ... ''. Просто указав это на случай, если вы этого не знаете. Что касается вашего регулярного выражения, попробуйте обернуть его в parens таким образом, чтобы поставляемое регулярное выражение было обернуто. Также я не уверен, почему вам нужно было изменить скрипт. Вывод в сообщении - это результат, который вы ожидаете, не так ли? Каковы недостатки краев? Позаботьтесь об этом? – 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> 
'