有没有办法在UNIXsorting中忽略标题行?

我有一个固定宽度的字段文件,我试图使用UNIX(Cygwin,在我的情况)sorting实用程序进行sorting。

问题是文件顶部有一个双行标题,正在sorting到文件底部(每个标题行以冒号开头)。

有没有办法告诉sorting“通过未sorting的前两行”或指定一个sortingsorting顶部的sorting – 其余行总是以6位数字开始(这实际上是关键我如果有帮助的话。

例:

:0:12345 :1:6:2:3:8:4:2 010005TSTDOG_FOOD01 500123TSTMY_RADAR00 222334NOTALINEOUT01 477821USASHUTTLES21 325611LVEANOTHERS00 

应该sorting为:

 :0:12345 :1:6:2:3:8:4:2 010005TSTDOG_FOOD01 222334NOTALINEOUT01 325611LVEANOTHERS00 477821USASHUTTLES21 500123TSTMY_RADAR00 
 (head -n 2 <file> && tail -n +3 <file> | sort) > newfile 

圆括号创build一个子shell,将stdout封装起来,这样你就可以pipe理它或redirect它,就像它来自单个命令一样。

如果你不介意使用awk ,你可以利用awk的内置pipe道function

例如。

 extract_data | awk 'NR<3{print $0;next}{print $0| "sort -r"}' 

这将打印前两行逐字,并通过sort其余的pipe道。

请注意,这具有能够有select地对pipe道input的一部分进行分类的特别优点。 所有build议的其他方法将只sorting可以多次读取的纯文件。 这适用于任何事情。

这是一个适用于pipe道数据的版本:

 (read -r; printf "%s\n" "$REPLY"; sort) 

如果您的标题有多行:

 (for i in $(seq $HEADER_ROWS); do read -r; printf "%s\n" "$REPLY"; done; sort) 

这个解决scheme是从这里

你可以使用tail -n +3 <file> | sort ... tail -n +3 <file> | sort ... (尾部会输出第三行的文件内容)。

 head -2 <your_file> && nawk 'NR>2' <your_file> | sort 

例:

 > 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 

它只需要2行代码…

 head -1 test.txt > a.tmp; tail -n+2 test.txt | sort -n >> a.tmp; 

对于数字数据,-n是必需的。 对于alphasorting,-n不是必需的。

示例文件:
$ cat test.txt


8

100
1
-1

结果:
$ cat a.tmp


-1
1

8
100

使用Python:

 import sys HEADER_ROWS=2 for _ in range(HEADER_ROWS): sys.stdout.write(next(sys.stdin)) for row in sorted(sys.stdin): sys.stdout.write(row) 

这是一个从其他答案派生的bash shell函数。 它处理文件和pipe道。 第一个参数是stdin的文件名或' – '。 剩余的参数被传递给sorting。 几个例子:

 $ hsort myfile.txt $ head -n 100 myfile.txt | hsort - $ hsort myfile.txt -k 2,2 | head -n 20 | hsort - -r 

shell函数:

 hsort () { if [ "$1" == "-h" ]; then echo "Sort a file or standard input, treating the first line as a header."; echo "The first argument is the file or '-' for standard input. Additional"; echo "arguments to sort follow the first argument, including other files."; echo "File syntax : $ hsort file [sort-options] [file...]"; echo "STDIN syntax: $ hsort - [sort-options] [file...]"; return 0; elif [ -f "$1" ]; then local file=$1; shift; (head -n 1 $file && tail -n +2 $file | sort $*); elif [ "$1" == "-" ]; then shift; (read -r; printf "%s\n" "$REPLY"; sort $*); else >&2 echo "Error. File not found: $1"; >&2 echo "Use either 'hsort <file> [sort-options]' or 'hsort - [sort-options]'"; return 1 ; fi } 

这和Ian Sherbin的答案是一样的,但是我的实现是:

 cut -d'|' -f3,4,7 $arg1 | uniq > filetmp.tc head -1 filetmp.tc > file.tc; tail -n+2 filetmp.tc | sort -t"|" -k2,2 >> file.tc; 
 cat file_name.txt | sed 1d | sort 

这将做你想要的。