Unix 如何删除前导和尾随“,删除ksh中每行每个字段的前导空格和尾随空格

Unix 如何删除前导和尾随“,删除ksh中每行每个字段的前导空格和尾随空格,unix,awk,ksh,gawk,Unix,Awk,Ksh,Gawk,我在ksh脚本中有很多函数(它经常使用gawk),可以对文件进行很多计算。文件被管道删除。 但是现在我的源文件改变了。现在,文件中的每个字段都包含双引号,如下所示。 此外,我还必须修剪前导和尾随空格或制表符(如果有) Old_Myfile.txt Name|Designation|emlid Alex|Software Design Engg|E0023 Corner|SDE|E0056 New_Myfile.txt "Name"|"Designation"|"emlid" "Alex"|

我在ksh脚本中有很多函数(它经常使用gawk),可以对文件进行很多计算。文件被管道删除。 但是现在我的源文件改变了。现在,文件中的每个字段都包含双引号,如下所示。 此外,我还必须修剪前导和尾随空格或制表符(如果有)

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 "
请建议与我已经编写的脚本兼容的方法。

使用
sed

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

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

也可以在
awk
脚本中组合,而无需执行此额外步骤。

此脚本可能因您的需要而过度设计,但它将单独在每个字段上运行(在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);
    }
  }
}
开始{
FS=“|”;
OFS=“|”;
}
{

对于(i=1;i如果引用的字段不能包含
|
s,则在现有awk脚本中添加以下内容作为第一行:

awk '
{ gsub(/[[:space:]]*"[[:space:]]*/,"") }
<existing script>
'
awk'
{gsub(/[:space:][]*“[[:space:][]*/,”“)}
'

HuMMM,您的代码在哪里?您引用的字段是否可以包含
|
s?例如
“Alex”|“Software”| Design | Engg”|“E0023”
.gsub(/(^“[]*.[]*”$)/,“,$i);我已经使用过这个解决方案;这给出了下面的结果:如果字段的两边都有空格,它只修剪一个边,即前导空格。我不得不将脚本修改为:gawk-F“|”{OFS=“|”}{for(I=1;iw为什么全局地将
gsub
更改为
sub
gsub
will”“替换每行的每个引用。这比使用两个for循环更好,每个for循环执行一个
sub
操作。此外,
gawk-F”|“
gawk'BEGIN{FS=“|”之间没有区别。”…'
。如果您不知道,请指出这一点。至于您的正则表达式,请尝试用包装方式将其包装为所提供的正则表达式。此外,我不确定您为什么需要修改脚本。文章中的输出是您期望的输出,对吗?缺少哪些边缘情况?是否提供这些?
awk '
{ gsub(/[[:space:]]*"[[:space:]]*/,"") }
<existing script>
'