Mic*_*udl 6 sorting string bash awk multiple-columns
假设一个包含x个字符串列的文本文件.
$cat file # where x=3
foo foo foo
bar bar bar
baz baz
qux
Run Code Online (Sandbox Code Playgroud)
在bash中是否有一种方法可以按照它们包含的数字文本字符串(即填充的行)对这些列进行排序,同时保持每列中行的内部顺序?
$sought_command file
foo foo foo
bar bar bar
baz baz
qux
Run Code Online (Sandbox Code Playgroud)
基本上,具有最多行数的列是第一个,具有第二多行数的列是第二个,等等.
(这个任务很容易实现R,但我想知道通过bash的解决方案.)
编辑1:
以下是一些其他详细信息:每列包含至少一个文本字符串(即一个填充行).文本字符串可以构成任何字母数字组合并且具有任何长度(但显然不包含空格).输出列不得插入空行.列分隔符没有先验限制,只要它在整个表中保持一致即可.
此任务所需的只是按原样移动列,以便按列长度排序.(我知道在bash中实现它听起来比实际更容易.)
使用 GNU awk forsorted_in 并假设您的列是制表符分隔的:
$ cat tst.awk
BEGIN{ FS=OFS="\t" }
{
for (i=1; i<=NF; i++) {
if ($i ~ /[^[:space:]]/) {
cell[NR,i] = $i
cnt[i]++
}
}
next
}
END {
PROCINFO["sorted_in"] = "@val_num_desc"
for (row=1; row<=NR; row++) {
c=0
for (col in cnt) {
printf "%s%s", (c++?OFS:""), cell[row,col]
}
print ""
}
}
$ awk -f tst.awk file
foo foo foo
bar bar bar
baz baz
qux
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |