如何在具有标题行的文件上使用Unix排序命令?

时间:2017-10-19 18:17:26

标签: bash unix

如何使用sort?

省略csv文件中的标题行

到目前为止,我有这个:

sort -o  ./trans.csv -k 1,1n ./trans.csv

除了标题行之外,它也能很好地排序。

4 个答案:

答案 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