【问题标题】:how to do sorting of column 3, and change corresponding value of column 2 in new file using shell scripting? [closed]如何对第 3 列进行排序,并使用 shell 脚本更改新文件中第 2 列的对应值? [关闭]
【发布时间】:2018-08-30 06:08:44
【问题描述】:

我想使用sort 命令进行排序。 输入文件为1.txt

      1    2   2
      1    3   5.5
      1    4   1.5
      1    5    2.2
      2    1    1.1
      2    3    0.7
      2    4    0.9
      2    5    0.4

输出文件应该是

  1    4   1.5
  1    2   2
  1    5   2.2
  1    3   5.5
  2    5   0.4
  2    3   0.7
  2    4   0.9
  2    1   1.1

第 3 列应排序,相应的第二列应更改。

【问题讨论】:

    标签: linux shell sorting


    【解决方案1】:

    似乎您只想对两个键进行数字排序:

    $ sort -n -k1 -k3 file
          1    4   1.5
          1    2   2
          1    5    2.2
          1    3   5.5
          2    5    0.4
          2    3    0.7
          2    4    0.9
          2    1    1.1
    

    -n 进行数字排序,首先在字段 1 -k1 上,然后在字段 3 -k3 上。

    【讨论】:

      【解决方案2】:

      然后尝试调整这个:

      cat 1.txt | sed -E -e 's/[[:blank:]]+/ /g' | awk 'BEGIN {FS=" "; OFS=" "} {print $1, $3, $2}' | sort | awk 'BEGIN {FS=" "; OFS=" "} {print $1, $3, $2}'
      
      • sed - 将列分隔符统一为一个空格
      • awk - 更改列的顺序
      • sort - 对它们进行相应的排序
      • awk - 将列的顺序更改为正常

      【讨论】:

        【解决方案3】:

        这是一个使用 GNU awk 的例子。它读取内存中的数据并在输出时进行排序,因此一个巨大的文件可能会给您带来问题:

        $ awk '{
            a[$1][$3]=$0
        }
        END { 
            PROCINFO["sorted_in"]="@ind_num_asc"
            for(i in a)
                for(j in a[i])
                    print a[i][j]
        }' file
        

        输出(awk 输出后清除前导空格):

        1    4   1.5
        1    2   2
        1    5    2.2
        1    3   5.5
        2    5    0.4
        2    3    0.7
        2    4    0.9
        2    1    1.1
        

        【讨论】:

          猜你喜欢
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多