如何使用sort?
省略csv文件中的标题行到目前为止,我有这个:
sort -o ./trans.csv -k 1,1n ./trans.csv
除了标题行之外,它也能很好地排序。
答案 0 :(得分:5)
要在输出中保留标题,并对所有非标题行进行排序:
# create a temporary file to store output to
infile="trans.csv"
tempfile=$(mktemp "${infile}.XXXXXX")
if {
IFS= read -r header # read header from input to variable
printf '%s\n' "$header" # write header from variable to output
sort -k 1,1n # pass all other input to output through sort
} <"$infile" >"$tempfile"; then # if sort reports success (exit status 0)
mv -- "$tempfile" "$infile" # ...then atomically rename over input
else # if sort fails...
echo "ERROR: Output file and input file have different line counts" >&2
rm -f "$tempfile" # then delete the temporary file.
false # and ensure that $? reflects a failure
fi
请注意,if
块仅检查sort
的退出状态,理论上我们更关心数据是否通过标头。如果不是首选,请考虑使用&&
而不是换行来附加块中的项目。
答案 1 :(得分:0)
您可以使用tail
跳过第一行:
tail -n +2 ./trans.csv | sort -o ./trans.csv -k 1,1n
-n +2
表示“从第二行输入开始输出”。
答案 2 :(得分:0)
您可以这样尝试:
(read line;echo $line;(while read line;do echo $line;done) | sort -k 1,1n)<infile
答案 3 :(得分:0)
( sed -u 1q; sort -k 1,1n ) < trans.csv > trans-sorted.csv
(GNU Coreutils Manual中建议)
-u
选项对于不丢失数据很重要(请参阅注释)。
或:
( read header; echo $header; sort -k 1,1n ) < trans.csv > trans-sorted.csv
最终使用相同的文件名:添加&& mv trans-sorted.csv trans.csv
:
( read header; echo $header; sort -k 1,1n ) < trans.csv > trans-sorted.csv && mv trans-sorted.csv trans.csv