2012-06-29 51 views
2

我有一个脚本来对for循环中的某些列进行排序。我想跳过排序过程中的标题,但我失败了。这是我的:Bash排序并跳过标题。

for i in file* 
do 
    sort -k 1,1 -k 3,3n -t\; ${i} > h${i} 
    rm ${i} 
done 

如何跳过排序过程中的标题,但保留在输出?

谢谢。

+1

所有的花括号是多余的,因为没有要避免歧义。更重要的是引用变量:''$ i“' –

回答

2

头是文件的第一行吗? 如果是,请尝试下一个:

for i in file* 
do 
    head -1 ${i} > h${i} 
    sed 1d ${i} | sort -k 1,1 -k 3,3n -t\; >> h${i} 
    rm ${i} 
done 
+0

这对我来说很好。重要的想法是“head -1 $ {i}> h $ {i}”这一行,在删除头文件和对文件进行排序之前实际上保存了头文件。这是我错过的。 – g256

0

您可以在使用sed排序之前删除标头。 未经测试的代码。

for i in file* 
do 
    sed 1d ${i} | sort -k 1,1 -k 3,3n -t\; > h${i} 
    rm ${i} 
done 
+0

是'$ {1}'还是'$ {i}'?在第3行 – Tamil

+0

错字。 thx @Tamil。编辑答案。 – tuxuday

+0

由于sed命令会自动生成一个空文件,因此它只会输出标题。所以最后你得到的只是标题。 – g256

0

这可能为你工作(GNU的sed和Bash):

sed -i '1{h;d};:a;$!{N;ba};s/.*/cat <<\\EOF|sort -k1,1 -k3,3n -t\\;\n&\nEOF/e;H;g' file* 
0
for i in file* 
do 
    awk 'NR==1;NR>1{print|"sort -k 1,1 -k 3,3n -t\;"}' ${i} > $h{i} 
    rm ${i} 
done 
3
cat YOURFILE| (read -r; printf "%s\n" "$REPLY"; sort) 
+0

原始标志的任何原因? printf而不是仅回显“$ REPLY”?我想这只是逃避或避免逃脱角色,但一些解释是值得欢迎的。否则显然是管理数据的最优雅的解决方案。 – Cimbali

+0

这一个几乎是完美的,但你需要使用“IFS =读”,而不是“读”,以保持前导和尾随空格。 –