如何使用第二列中的键对文件中每 4 行的第一列进行排序

mun*_*ish 4 linux text-processing sort

示例文件:

第一列可以有固定的 4 个无序值集 world1.com,world2.com,world3.com or world4.com

第二列是属于每一行的键,这样四个集合中的每一个都有唯一的随机键。

world4.com           /randomkeyhghgdh778/key67567
world1.com           /randomkeygahjuh572/key639839
world2.com           /randomkey788gauh72/key63whjk
world3.com           /randomkey788gauh72/key63whjk
world1.com           /randomkeyhueh34778/key67uuu77
world4.com           /randomkey8998382/key6hh77686
world3.com           /randomkey7HHHH0000/key6333355k
world2.com           /randomkeyJJJJ1111/key63333
Run Code Online (Sandbox Code Playgroud)

等等

期望输出:

world1.com           /randomkeygahjuh572/key639839
world2.com           /randomkey788gauh72/key63whjk
world3.com           /randomkey788gauh72/key63whjk
world4.com           /randomkeyhghgdh778/key67567
world1.com           /randomkeyhueh34778/key67uuu77
world2.com           /randomkeyJJJJ1111/key63333
world3.com           /randomkey7HHHH0000/key6333355k
world4.com           /randomkey8998382/key6hh77686
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 5

按世界组织文件:

$ paste -d'\n' <(grep world1 file) <(grep world2 file) <(grep world3 file) <(grep world4 file)
world1.com           /randomkeygahjuh572/key639839
world2.com           /randomkey788gauh72/key63whjk
world3.com           /randomkey788gauh72/key63whjk
world4.com           /randomkeyhghgdh778/key67567
world1.com           /randomkeyhueh34778/key67uuu77
world2.com           /randomkeyJJJJ1111/key63333
world3.com           /randomkey7HHHH0000/key6333355k
world4.com           /randomkey8998382/key6hh77686
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

我们可以用来grep为每个世界选择线条:

$ grep world4 file
world4.com           /randomkeyhghgdh778/key67567
world4.com           /randomkey8998382/key6hh77686
Run Code Online (Sandbox Code Playgroud)

paste合并来自多个文件的行。粘贴命令可能如下所示:

paste -d'\n' file1 file2 file3 file3.
Run Code Online (Sandbox Code Playgroud)

我们实际上不必为每个世界创建真实的文件。相反,我们可以使用进程替换为每个对象创建类似文件的对象:

paste -d'\n' <(grep world1 file) <(grep world2 file) <(grep world3 file) <(grep world4 file)
Run Code Online (Sandbox Code Playgroud)

bash、zsh 和 AT&T ksh88 和 ksh93 支持进程替换,但不支持 dash、pdksh 或 mksh。

附加功能:按键排序

为了说明这种方法的灵活性,我们将对每个世界的键进行排序。 注意:排序会破坏行集。如果您想将集合放在一起,请不要使用它。

我们可以使用grep,然后sort每个世界分开世界,然后使用将线合并在一起paste

$ paste -d'\n' <(grep world1 file | sort -k2,2) <(grep world2 file | sort -k2,2) <(grep world3 file | sort -k2,2) <(grep world4 file | sort -k2,2)
world1.com           /randomkeygahjuh572/key639839
world2.com           /randomkey788gauh72/key63whjk
world3.com           /randomkey788gauh72/key63whjk
world4.com           /randomkey8998382/key6hh77686
world1.com           /randomkeyhueh34778/key67uuu77
world2.com           /randomkeyJJJJ1111/key63333
world3.com           /randomkey7HHHH0000/key6333355k
world4.com           /randomkeyhghgdh778/key67567
Run Code Online (Sandbox Code Playgroud)

请注意,这sort取决于语言环境。不同的locales可能导致不同的订单。