我有一个困惑的文件内容如下:
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
语句声明了一个映射,允许您查找每个记录类型的顺序。具体值(1
、2
等)无关紧要,只要它们按您想要的顺序排序即可;如果愿意,您可以使用字母或单词。
然后下一行由以下命令组成:
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/