bash - 按一定顺序使用字符串值对文件内容进行排序

标签 bash sorting

我有一个困惑的文件内容如下:

13,13,GAME_FINISH,
1,1,GAME_START,
1,1,GROUP_FINISH,
17,17,WAGER,200.00
2,2,GAME_FINISH,
2,2,GAME_START,
22,22,GAME_WIN,290.00
2,2,GROUP_FINISH,
32,32,WAGER,200.00
3,3,GAME_FINISH,
3,3,GAME_START,
.... more lines

我对其进行了排序,目前以下列格式保存文件内容:

1,1,GAME_FINISH,
1,1,GAME_START,
1,1,GROUP_FINISH,
1,1,WAGER,200.00
2,2,GAME_FINISH,
2,2,GAME_START,
2,2,GAME_WIN,290.00
2,2,GROUP_FINISH,
2,2,WAGER,200.00
3,3,GAME_FINISH,
3,3,GAME_START,
3,3,GROUP_FINISH,
3,3,WAGER,200.00
... more lines

但是如何更好地排序以获得以下格式?第三和第四行可能并不总是存在。

1,1,WAGER,200.00
1,1,GAME_START,
1,1,GAME_WIN,500.00
1,1,BONUS_WIN_1,1100.00
1,1,GAME_FINISH,
1,1,GROUP_FINISH,
2,2, more lines...

对于初始排序,我使用了

sort -t, -g -k2 nameofunsortedfile.csv >> sortedfile.csv

补充信息:

我想按以下顺序排序 - 下注、游戏开始、游戏获胜、奖金获胜、游戏结束、小组结束。我当前排序的不是这个顺序。游戏胜利和奖金胜利可能并不总是存在。

我期望的顺序不是字典,也不是随机的。每个数字总是有下注、开始、游戏结束组结束序列。 game_win、game_bonus 是可选的。寻找一种方法来按照提到的预期顺序对目标 1,1 进行排序,继续对 2,2 执行相同的操作,依此类推。

最佳答案

使用标准 UNIX 实用程序执行此操作的最直接方法可能是向每一行添加一个附加字段,以按照您想要的顺序排序的方式对记录类型进行编码。

declare -A mapping=( ["WAGER"]=1 ["GAME_START"]=2 ["GAME_WIN"]=3 ["BONUS_WIN"]=4 ["GAME_FINISH"]=5 ["GROUP_FINISH"]=6 )
cut -d, -f3 filename.txt | while read; do echo ${mapping["$REPLY"]}; done | paste -d, - filename.txt | sort | sort -s -t, -n -k 2,3 | cut -d, -f 2-

declare 语句声明了一个映射,允许您查找每个记录类型的顺序。具体值(12 等)无关紧要,只要它们按您想要的顺序排序即可;如果愿意,您可以使用字母或单词。

然后下一行由以下命令组成:

  • cut -d, -f3 filename.txt 提取您想要排序的内容(WAGER 或其他)
  • 阅读时;做 echo ${mapping["$REPLY"]}; done 获取每个值(WAGER 等)并将其替换为关联数组 mapping
  • 中相应的可排序值
  • paste -d, - filename.txt 将这些值粘贴回 filename.txt
  • 中每一行的开头
  • 排序 | sort -s -t, -n -k 2,3 具有按字段 2 排序的效果,然后是字段 3,然后是字段 1(我们添加的那个)。如果 sort 可以使用三个字段作为键,我们可以在单个 sort 命令中完成此操作,但它最多只接受两个字段作为排序依据。
  • cut -d, -f 2- 删除添加的字段,留下原始记录,但按排序顺序

关于bash - 按一定顺序使用字符串值对文件内容进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41599894/

相关文章:

linux - 文件列表

Perl 自定义排序

python - 为什么我的快速排序在 python 中这么慢?

iphone - 在 UITableViewController 中对行进行排序

Bash 编程 : get name of one-and-only subfolder of given directory

python - 如何在bash中读取python的输入

json - 在 bash 中将无效的 json 转换为有效的

java - 从处理中运行的脚本未正确执行

ruby - 如何在 ruby​​ 表中按数字顺序对文本进行排序

google-app-engine - 如何在 GAE Go 中对 slice 进行排序