我有一个脚本来对for循环中的某些列进行排序。我想跳过排序过程中的标题,但我失败了。这是我的:Bash排序并跳过标题。
for i in file*
do
sort -k 1,1 -k 3,3n -t\; ${i} > h${i}
rm ${i}
done
如何跳过排序过程中的标题,但保留在输出?
谢谢。
我有一个脚本来对for循环中的某些列进行排序。我想跳过排序过程中的标题,但我失败了。这是我的:Bash排序并跳过标题。
for i in file*
do
sort -k 1,1 -k 3,3n -t\; ${i} > h${i}
rm ${i}
done
如何跳过排序过程中的标题,但保留在输出?
谢谢。
头是文件的第一行吗? 如果是,请尝试下一个:
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
这对我来说很好。重要的想法是“head -1 $ {i}> h $ {i}”这一行,在删除头文件和对文件进行排序之前实际上保存了头文件。这是我错过的。 – g256
这可能为你工作(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*
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
cat YOURFILE| (read -r; printf "%s\n" "$REPLY"; sort)
原始标志的任何原因? printf而不是仅回显“$ REPLY”?我想这只是逃避或避免逃脱角色,但一些解释是值得欢迎的。否则显然是管理数据的最优雅的解决方案。 – Cimbali
这一个几乎是完美的,但你需要使用“IFS =读”,而不是“读”,以保持前导和尾随空格。 –
所有的花括号是多余的,因为没有要避免歧义。更重要的是引用变量:''$ i“' –