Rob*_*iam 92 unix sorting command-line
我有一个固定宽度字段文件,我正在尝试使用UNIX(Cygwin,在我的情况下)排序实用程序排序.
问题是文件顶部有一个两行标题,它被排序到文件的底部(因为每个标题行以冒号开头).
有没有办法告诉排序"将前两行传递给未排序的"或指定将冒号行排序到顶部的排序 - 其余行总是以6位数字开头(这实际上是关键字I如果有帮助的话,我会整理.
例:
:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
500123TSTMY_RADAR00
222334NOTALINEOUT01
477821USASHUTTLES21
325611LVEANOTHERS00
Run Code Online (Sandbox Code Playgroud)
应该排序:
:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
222334NOTALINEOUT01
325611LVEANOTHERS00
477821USASHUTTLES21
500123TSTMY_RADAR00
Run Code Online (Sandbox Code Playgroud)
Bob*_*obS 109
(head -n 2 <file> && tail -n +3 <file> | sort) > newfile
Run Code Online (Sandbox Code Playgroud)
括号创建一个子shell,包装stdout,这样你就可以管它或重定向它,好像它来自一个命令.
Dav*_*ave 54
如果你不介意使用awk,你可以利用awk内置的管道功能
例如.
extract_data | awk 'NR<3{print $0;next}{print $0| "sort -r"}'
Run Code Online (Sandbox Code Playgroud)
这将逐字打印前两行,并通过其他方式管道sort.
请注意,这具有非常特定的优点,即能够有选择地对管道输入的部分进行排序.建议的所有其他方法只会对可以多次读取的普通文件进行排序.这适用于任何事情.
And*_*rea 36
在简单的情况下,sed可以优雅地完成工作:
your_script | (sed -u 1q; sort)
Run Code Online (Sandbox Code Playgroud)
或等效地,
cat your_data | (sed -u 1q; sort)
Run Code Online (Sandbox Code Playgroud)
关键在于1q-- 打印第一行(标题)并退出(将其余的输入留给sort)。
对于给出的示例,2q将解决问题。
该-u开关(无缓冲)所需的那些sedS(值得注意的是,GNU的),否则将读取输入的数据块,从而消耗数据要经过sort代替。
小智 29
这是一个适用于管道数据的版本:
(read -r; printf "%s\n" "$REPLY"; sort)
Run Code Online (Sandbox Code Playgroud)
如果您的标题有多行:
(for i in $(seq $HEADER_ROWS); do read -r; printf "%s\n" "$REPLY"; done; sort)
Run Code Online (Sandbox Code Playgroud)
这个解决方案来自这里
head -2 <your_file> && nawk 'NR>2' <your_file> | sort
Run Code Online (Sandbox Code Playgroud)
例子:
> cat temp
10
8
1
2
3
4
5
> head -2 temp && nawk 'NR>2' temp | sort -r
10
8
5
4
3
2
1
Run Code Online (Sandbox Code Playgroud)