Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 使用非换行符或零字节的记录分隔符对CSV进行排序_Sorting_Csv_Awk - Fatal编程技术网

Sorting 使用非换行符或零字节的记录分隔符对CSV进行排序

Sorting 使用非换行符或零字节的记录分隔符对CSV进行排序,sorting,csv,awk,Sorting,Csv,Awk,我的CSV如下所示: "212314334","a sentence with new line in it \n this is the next line","kajdfad","213",ENDOFLINE\r\n "212314333","another sentence with new line in it \r\n this is the next line","kawad","21453",ENDOFLINE\r\n 所以在记录的中间可以有新行。文件中也可能有不可打印的字符。记

我的CSV如下所示:

"212314334","a sentence with new line in it \n
this is the next line","kajdfad","213",ENDOFLINE\r\n
"212314333","another sentence with new line in it \r\n
this is the next line","kawad","21453",ENDOFLINE\r\n
所以在记录的中间可以有新行。文件中也可能有不可打印的字符。记录分隔符是
,ENDOFLINE\r\n

Linux
sort
的记录分隔符要么是换行符,要么是零字节,因此我无法使用它

我尝试将
awk
RS
一起使用:

awk -F, 'BEGIN {RS="ENDOFLINE\r\n"} {print }' myFile | sort -t $',' -k 1

但看起来排序仍然使用换行符作为定界符,因为它在中间分裂记录。

有没有办法解决这个问题

使用同事建议的可能解决方案进行编辑:

awk -F, 'BEGIN {RS="END\r\n";i=0;} {array[i]=$2","$0"END\r"; i=i+1}END {n = asort(array, dest);for (i=1; i<=n; i++) dest[i] = substr(dest[i], index(dest[i], $1)) ; for (i=1; i<=n; i++) print dest[i]}

awk-F,'BEGIN{RS=“END\r\n”;i=0;}{array[i]=2',“$0”END\r;i=i+1}END{n=asort(array,dest);for(i=1;iEDIT):在注释中向我指出的原始代码中有一些令人尴尬的错误。这应该可以修复它们

问题是,
sort
不再知道
awk
所做的拆分,因为
awk
的输出与输入是不变的。我的建议是在
awk
中完成整件事

awk -F, 'BEGIN { RS = "ENDOFLINE\r\n" } { lines[$1] = lines[$1] $0 RT } END { n = asorti(lines, keys); for(i = 1; i <= n; ++i) { printf("%s", lines[keys[i]]) } }'
awk-F,'BEGIN{RS=“ENDOFLINE\r\n”}{lines[$1]=lines[$1]$0rt}END{n=asorti(lines,key);for(i=1;i另一个awk

awk -F, -vRS="ENDOFLINE/n" '
        {a[NR]=$0}END{x=asort(a);while(++i<=x)printf "%xs",a[i] RT}' file
awk-F,-vRS=“ENDOFLINE/n”

{a[NR]=$0}END{x=asort(a);虽然(+iit不太清楚您的最终目标是什么。您可以澄清一下吗?您将示例输入显示为以
ENDOFLINE\n
结束每一行,但在awk脚本中,您将RS设置为
ENDOFLINE\r\n
(即,您将
\r
粘贴在中间)。似乎这可能是个问题。您的文件是否包含
\r
s?如果是,它们在哪里?它们会做出更好的RS吗?@fedorqui我的目标是按其中一列(我给出的示例中的第一列)对记录进行排序“Ed Morton,我试图简化问题,意外地删除了/R。它是记录定界符的一部分。”ED莫尔顿修正了这个例子。只是为了使事情更清楚。\r\n也可以出现在记录的中间。永远不要使用字母<代码> L <代码>作为变量名,因为它看起来太像数字<代码> 1 /代码>,难以区分。在某些字体中。但更重要的是,
for(l in line)
将按照键在内部哈希表中的存储顺序访问键,而不是按照您刚才对它们进行排序的顺序。更重要的是,
asort()
按数组内容排序,而不是按索引排序(即
asorti()
)。而且最重要的是,此解决方案假定
$1
值是唯一的,没有任何指示,因此将删除任何具有重复
$1
值的初始条目。@EdMorton噢,这太尴尬了。代码更新应该解决所有问题。我没有借口。它仍将删除任何具有重复的$1和s的行直到在
中排序后以随机顺序打印行为止。现在只剩下随机输出顺序-要解决这个问题,请去掉显式填充的
键[]
,因为您需要使用
asorti(行,键)
创建第二个索引数组,然后将循环写入
for(k=1;k in keys;k++)
。然后是喝咖啡的时间:-)@EdMorton是的,我只是读了一下。奇怪的是,我从来没有遇到过这个问题。这有可能巧合地总是适用于GNU awk吗?我不是说这是一个可以依赖的东西,但这可能解释了为什么我从来没有遇到过这个问题。一旦我读了asorti文档,我可能会再次更改代码以合并您的方法顺便说一句,还有一些。当需要对$1进行排序时,整行排序可能会给出相同的结果,也可能不会给出相同的结果,这取决于$1是否总是具有相同的字符数。@EdMorton刚刚重读了你所说的,看起来OP的所有第一个字段都是相同的,但我认为应该将其作为一个假设。很难说从两行输入。我只是假设它们是数字,但idk。
awk -F, -vRS="ENDOFLINE/n" '
        {a[NR]=$0}END{x=asort(a);while(++i<=x)printf "%xs",a[i] RT}' file