OSX - 仅按第一个字符“排序”,尝试-k 1.1,1.1

时间:2011-09-08 17:04:02

标签: macos bash shell unix sorting

我在OSX 10.6.8

我在使用第一个字符排序文本文件时遇到了一些问题。

我将三个文件连接成一个,并且需要按第一个字母字母排序的最终结果。 每个文件都有如下所示的行:

A025-001                                            
A118-001                                            
A118-002                                        
B657-001                                            
D316-001                                        

因此通过“cat”连接后的文件如下所示:

A025-001
....
A025-001 (where file 2 was appended)
....
A025-001  (where file 3 was appended)

我已经尝试了“sort -k 1.1,1.1 result.txt> sortedresult.txt”以及手册页中的大量其他选项:i,b,f,s(只是猜测我希望我可能找到了正确的一个)

我需要将所有条目放在一起:

A025-001

A025-001

B.......

B.......

D.......

希望有更多知识渊博的人能帮助我解决这个问题。

由于

更新:数据文件本身与unix工具不兼容。如果我捕获结果文件,则只显示几行。在“vim”中打开它们会显示一堆^ M个字符。好像排序不是通过整个文件。

顶部有列标题,引号中的字段,以制表符分隔,例如“产品”\ t“类别”\ t 其余数据是制表符分隔但没有引号。 样本od -c:

    0000000    "   P   r   o   d   u   c   t       N   u   m   b   e   r   "
    0000020   \t   "   L   o   o   k   u   p       A   t   t   r   i   b   u
    0000040    t   e       1       G   r   o   u   p   "  \t   "   L   o   o
    0000060    k   u   p       A   t   t   r   i   b   u   t   e       1    
    0000100    N   a   m   e   "  \t   "   L   o   o   k   u   p       A   t
    0000120    t   r   i   b   u   t   e       1       V   a   l   u   e   "
    0000140   \t   "   L   o   o   k   u   p       A   t   t   r   i   b   u
    0000160    t   e       1       V   a   l   u   e       I   m   a   g   e
    0000200    "  \t   "   L   o   o   k   u   p       A   t   t   r   i   b

以下是一些数据(不是列标题):

    0000660   "    \n  A   0   2   5   -   0   0   1  \t   F   a   c   e   t
    0000700   \t   F   a   c   e   t   C   o   l   o   r  \t   B   l   u   e
    0000720   \t   C   C   D   D   D   D  \t   O   P   T   I   O   N  \t  \r

有谁知道为什么会这样做?

更新#2:文件以ASCII格式从FileMaker导出。你会看到很多额外的标签,只是忽略它们,一旦我们弄清楚这一点,我就会把它们拿出来。这是整个文件以及文件的hexdump和od -c:pastebin.com/UzaUgG6C

4 个答案:

答案 0 :(得分:1)

我认为问题只是行结尾。 ^M个字符是回车符。 UNIX工具通常需要换行符,并且没有回车符。尝试this question的答案,或尝试运行mac2unix

答案 1 :(得分:1)

查看pastebin,似乎FileMaker使用\ n终止列标题并用\ r分隔您的记录。您需要首先规范化行结尾。

cat result.txt | tr '\r' '\n' | sort

答案 2 :(得分:0)

你应该简单地尝试:

cat file1.txt file2.txt file3.txt | sort > result.txt

使用-k 1.1,1.1将无法使用,因为只有一个字段

为了使其稳定,即第一个字符相同的条目组将保持相对排序相同,您可以将-s开关与-k 1.1,1.1开关一起使用。 / p>

cat file1.txt file2.txt file3.txt | sort -s -k 1.1,1.1 > result.txt

我认为这是您需要的解决方案。

答案 3 :(得分:0)

尝试

 sort -k1.1,1.2  result.txt > sortedresult.txt

我希望这会有所帮助。

P.S。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,并且/或者给它一个+(或 - )作为有用的答案。