【问题标题】:find the number of the field查找字段的编号
【发布时间】:2011-05-24 06:17:38
【问题描述】:

我在文件中有这一行:

,2,353867835022;11,353681041426390,272023201187741,272-02f-20017-06609,353854100352;11,,,,,,,0854100352,3,00,,O,D,DATA,,,7124395,,,17687,16,HPLMN,M20MSS_TTFILE_8377_20110528170245,M20MSS,W30B22I;0GRI3,1,20110528130013,170054,1,41,,,,,,,,0,,,,,,,,,,,,,,,,,,353868001820,,,,b60a5c0014,1:353867835022::::0854100352::353854100352,,,,,,,,

是的, 这是一个逗号“,”分隔文件。有一个数字 17687 。我想知道该行中该字段的编号是多少。 我想以此为基础并将其包含在 shell 脚本中。

【问题讨论】:

    标签: bash shell unix awk


    【解决方案1】:

    字段 #26:

    % awk -F',' '/17687/ {
        for (f = 0; f < NF; ++f) {
            if ($f == "17687") {
                print $f " found in field number " f " of " NF " on line " NR "."
            }
        }
    }' test.csv
    17687 found in field number 26 of 75 on line 1.
    

    这允许在多行的多个字段中查找 17687。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      那么,您想要 17687 之前的逗号数吗?一种方法是:

      sed -r 's/(^.*,)17687,.*$/\1/;s/[^,]//g'|wc -c
      

      这会抓取 17687 之前的所有内容,删除所有非逗号,并计算字符数。

      在脚本中使用它,您可能会执行以下操作:

      FIELD_NO=`sed -r 's/(^.*,)17687,.*$/\1/;s/[^,]//g'|wc -c`
      cut -d',' -f$FIELD_NO some_file
      

      【讨论】:

        【解决方案3】:

        您还可以使用 tr 将字段分隔符更改为换行符,如果您愿意,可以使用 grep 查找行和 cat。例如:

        $ cat t.csv|tr ',' '\n'|cat -n|grep  17687
            26  17687
        

        或更好

        $ cat t.csv|tr ',' '\n'|grep  -n 17687
        26:17687
        

        甚至

        $ tr ',' '\n' < t.csv |grep  -n 17687
        26:17687
        

        【讨论】:

        • OP 没有这么说,但我猜这是具有大量 CSV 样式记录的文件的第一行,因此将逗号转换为换行符可能会破坏该功能告诉特定记录在哪里结束。
        【解决方案4】:

        对仅使用一个正则表达式的David's 版本的小改进。

        sed -r "s/17687,.*|[^,]*//g"  | wc -c
        

        【讨论】:

          【解决方案5】:

          Perl?

          FLD="17687"
          perl -F/,/ -slane '%h=map{$_,++$i}@F ;print $h{$fld}||0' -- -fld="$FLD"
          

          您的示例行将打印 26(从 1 开始计数)或“0”(如果未找到)。将搜索字符串的最后一个索引。

          perl -F/,/ -slane 'map{print}grep { $F[$_] eq $fld } 0..$#F;' -- -fld="$FLD"
          

          将打印所有索引(从 0 开始计数)或什么都不打印...

          【讨论】:

            【解决方案6】:

            Awk oneliner,单进程:

            awk -F, '/17687/{n=NF;sub(".*,17687,","");print n-NF}' file
            

            对于大型文件,如果您的平台上可用,请使用闪电般的快速mawk

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-01-05
              • 2013-03-16
              • 1970-01-01
              • 2011-06-07
              • 1970-01-01
              • 1970-01-01
              • 2015-06-05
              • 2013-07-04
              相关资源
              最近更新 更多