我需要对 CSV 文件进行排序,但标题行(第一行)不断排序。这就是我正在使用的:
cat data1.csv | sort -t"|" -k 1 -o data1.csv
这是一个示例行:
Name|Email|Country|Company|Phone
Brent Trujillo|[email protected]|Burkina Faso|Donec LLC|(612) 943-0167
答案1
这应该可以工作并输出到data2.csv
:
head -n 1 data1.csv > data2.csv &&
tail -n +2 data1.csv | sort -t "|" -k 1 >> data2.csv
答案2
我认为问题的很大一部分是
... -k 1 ...
sort
他们的-k
论点意味着至少A-k [num]
开始 和 ,[num]
结尾各有参考。实际上,-k 1
这与根本不指定排序键没有什么不同,因为如果没有结束引用,sort
则会从行的开头到结尾对行进行排序。
如果您只想sort
在第一个|
分隔字段上换行,则需要执行以下操作:
... -k1,1 ...
如果你这样做了并且如果你的第一行开始然后|
,使用 GNUsort
你可以这样做......
sort -st\| -k1,1 <infile >outfile
...第一行将保持原样 - 你会得到你想要的行为。
我在上面指定了 GNU,sort
因为 POSIX 指定sort
计算一行上的所有字节对比较具有重要意义在用尽非-u
niquesort
操作上的所有排序键之后(两次 - 相邻的同等键控线在第一次通过后至少被指定为删除修饰符)并保留相邻的同等键线。这意味着对于...
printf '|%s\n' 9 1 | sort -nk1,1
...POSIXsort
打印...
|1
|9
...这可能是违反直觉的,因为第一个字段 - 也是唯一一个与任何-k
参数匹配的字段 - 完全是空的。默认情况下,GNUsort
也会打印相同的内容,但是当-s
指定表排序选项时,它会打印...
|9
|1
...因为它不会以与独特排序相同的方式评估超出命令行上指定的字段允许的任何行-u
- 尽管它不会删除-s
表排序的重复项。
根本不改变你的文件,如果你的标题行是第一行并且如果你使用 GNU 进行排序,sort
你可以这样做:
{ printf \|; cat file; } |
sort -st\| -k1,1 |
sed 's/.//;q'
...我认为,这将为您在标准输出上提供您想要的结果。
或者类似的东西...
{ printf \|; cat file; } |
nl -ba -s\| |
sort -t\| -k2,2 -k1n,1 |
cut -d\| -f2-
...对于任何实施来说肯定是这样