有没有办法在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
这将做你想要的。