【问题标题】:Using Awk to remove whitespace使用 awk 删除空格
【发布时间】:2012-01-07 00:16:35
【问题描述】:

我有一个格式如下的文件:

Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title
...

我正在尝试使用 awk 将文件解析为 makedbm 可读的形式(以制作自定义 NIS 映射)。字段分隔符是分号。我需要能够从每行的每个字段中删除所有前导空格,但在名称字段和标题字段中保留空格。谢谢。

【问题讨论】:

  • 您的意思是在Firstname LastnameJob Title 之间留下空格,还是在这些字段的前导空格?
  • @Johnsyweb,我喜欢这个链接。从现在开始,我仍然不会在提出问题之前进行任何调查,但我会确保放置“我检查了 NSURLconnection。我无法集成该代码”这句话。进入我所有的问题。你认为这样我会得到更好的回应吗? :-)

标签: awk centos nis


【解决方案1】:

如果你想删除 leading space from all fields 并保留 space in between the Names and Job title fields 那么你可以这样做 -

awk -F";" -v OFS=";" '{for (i=1;i<=NF;i++) gsub (/^ */,"",$i);print}' INPUT_FILE

测试:

[jaypal:~/Temp] cat file
Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title

[jaypal:~/Temp] awk -F";" -v OFS=";" '{for (i=1;i<=NF;i++) gsub (/^ */,"",$i);print}' file
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title

【讨论】:

    【解决方案2】:

    使用sed 可以更轻松地完成此操作:

    sed 's/^ *//; s/; */;/g'
    

    这假定您所有的空格都只是空格字符。要包含所有空格字符,请查看POSIX character classesviz

    sed 's/^[[:space:]]*//; s/;[[:space:]]*/;/g'
    

    演示(在 OSX 上):

    % echo 'Firstname LastName; 123-4567; Job Title
        Firstname LastName;   123-4567;      Job Title
    Firstname LastName;      123-4567; Job Title' | sed 's/^[[:space:]]*//; s/;[[:space:]]*/;/g'
    Firstname LastName;123-4567;Job Title
    Firstname LastName;123-4567;Job Title
    Firstname LastName;123-4567;Job Title
    

    如果您的sed 版本不支持用分号分隔语句,您可以使用-e 发出单独的命令:

    % echo 'Firstname LastName; 123-4567; Job Title
        Firstname LastName;   123-4567;      Job Title
    Firstname LastName;      123-4567; Job Title' | sed -e 's/^[[:space:]]*//' -e 's/;[[:space:]]*/;/g'
    Firstname LastName;123-4567;Job Title
    Firstname LastName;123-4567;Job Title
    Firstname LastName;123-4567;Job Title
    

    【讨论】:

      【解决方案3】:

      只需对你的字段号执行 gsub,例如:

      gsub (/^ */, "", $1);
      

      这将用空替换所有前导空格,同时保持所有其他空格不变。 gsub 函数使用指定变量上的新值全局替换给定模式。

      在这种情况下,模式为^ *,表示字符串的开头后跟零个或多个空格。替换模式是一个空字符串,被操作的变量是行中的第一个字段$1

      以下脚本显示了这一点,对于行中的所有列,由i 变量控制。 NF 是当前行的字段数,$i 指的是位置 i 的字段。

      $ cat file | awk -F\; -vOFS=\; '{
          for (i = 1; i <= NF; i++) {
              gsub (/^ */, "", $i);
          };
          print}'
      Firstname LastName;123-4567;Job Title
      Firstname LastName;123-4567;Job Title
      Firstname LastName;123-4567;Job Title
      

      【讨论】:

      • OP 明确表示他想“从每一行的 each 字段中删除所有前导空格”。
      • @lhf,我的误解,我认为第 1 列和第 3 列将完全保持不变。在重新阅读时,你是对的,只有 非前导 空格应该单独保留 - 修改以适应。
      • 但现在它看起来更像 Jaypal 的答案,所以我可能会在一段时间内将其删除。
      • @paxdiable 大声笑……我看了你的回答,认为我可能误解了他的问题并发布了第二个选项,仅从第二列中删除前导空格。 :)
      【解决方案4】:

      许多方法可以实现您的目标。

      只是为了好玩再添加一个:

      awk -v OFS=";" -F'; *' '{gsub(/^ */,"")}$1=$1' file
      

      更短:

      awk -v OFS=";" -F'; *' 'gsub(/^ */,"", $1)' file
      

      测试

      kent$  echo "Firstname LastName; 123-4567; Job Title
          Firstname LastName;   123-4567;      Job Title
      Firstname LastName;      123-4567; Job Title
      "|awk -v OFS=";" -F'; *' '{gsub(/^ */,"")}$1=$1'
      Firstname LastName;123-4567;Job Title
      Firstname LastName;123-4567;Job Title
      Firstname LastName;123-4567;Job Title
      
      
      kent$  echo "Firstname LastName; 123-4567; Job Title
          Firstname LastName;   123-4567;      Job Title
      Firstname LastName;      123-4567; Job Title
      "|awk -v OFS=";" -F'; *' 'gsub(/^ */,"",$1)'
      Firstname LastName;123-4567;Job Title
      Firstname LastName;123-4567;Job Title
      Firstname LastName;123-4567;Job Title
      

      【讨论】:

        【解决方案5】:

        试试这个

        {
            gsub(";  *",";")
            gsub("^  *","")
            print
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-29
          • 2013-07-14
          • 1970-01-01
          • 2012-05-08
          • 1970-01-01
          • 1970-01-01
          • 2017-07-21
          • 1970-01-01
          相关资源
          最近更新 更多