我想对一些在每行末尾标有@加数字的文件进行排序。问题是你可以在每行中找到不止一次的@。这个文件可以是这样的。
'Hello from line 2' @2
'Hello from line 3' @3
'Hi' @5 'Hello from line 1' @1
我希望我的输出能像这样排序
'Hi' @5 'Hello from line 1' @1
'Hello from line 2' @2
'Hello from line 3' @3
但是@5挡住了,我已经测试过了:
cat myFile.txt | sort -t@ -k2
但@并不在特定的列中,而是在最后一列。我已经看到了一些解决方案,在这个网站上使用awk,但它似乎在我的情况下失败。
任何帮助是欢迎的。
Schwartzian 变换 用awk和cut。
awk -F '@' '{print $NF,$0}' file | sort -n | cut -d " " -f 2-
$NF包含最后一列。
输出: 'Hi' @5 '第1行的你好' @1'第2行的你好' @2'第3行的你好' @3'第4行的你好
'你好' @5 '第一行的你好' @1'第二行的你好' @2'第三行的你好' @3
请您尝试以下组合 rev
+ sort
编写并测试了显示的样本,看到Cyrus的评论后,数字是个位数)。
rev Input_file | sort -n | rev
邏輯上的解釋。
sort
命令对其进行数字排序。rev
使Input_file成为实际的形式。$ sed 's/@\([^@]*\)$/'$'\37''\1/' input.txt | sort -t $'\37' -k2,2n | tr $'\37' '@'
'Hi' @5 'Hello from line 1' @1
Hello from line 2' @2
'Hello from line 3' @3
这首先将每行中的最后一个 @ 替换为 ASCII 字符。汽水分离器 字符(在你的输入中不太可能出现),用US作为字段分隔符对第二列进行排序,最后把US变成@。
在GNU awk中,有一个将记录散列为二维数组的方法。a
和分类使用 PROCINFO["sorted_in"]
以控制 for
遍历。首先是一个位改变的样本。
b@1
a@3
1@3
a@2
1@4
b@2
a@1
a@4
然后是程序
$ gawk 'BEGIN {
FS="@" # field separator
}
{
a[$NF][++c[$NF]]=$0 # hash records, 1st dim i the
} # number, 2nd serial of each
END { # each number if duplicates
PROCINFO["sorted_in"]="@ind_num_asc" # 1st dim, sort in index value
for(i in a) {
PROCINFO["sorted_in"]="@val_str_asc" # 2nd dim, sort on array value
for(j in a[i])
print a[i][j]
# PROCINFO["sorted_in"]="@ind_num_asc" # not sure if needed, seems like not
}
}' file
输出:
a@1
b@1
a@2
b@2
1@3
a@3
1@4
a@4
...或用你的数据。
'Hi' @5 'Hello from line 1' @1
'Hello from line 2' @2
'Hello from line 3' @3