Sorting 从命令行对文本记录进行排序
我使用Linux,将我的联系人存储在一个文本文件中,格式如下,用一行5星号分隔。我使用Vim打开并执行基本搜索。随着文件大小的增加,我想按“标签”或“跟进日期”对联系人进行排序。我把这些记录当作是在索引卡上。这种格式可能对我的目的来说是最好的,也可能不是最好的,所以我愿意接受一些提示Sorting 从命令行对文本记录进行排序,sorting,vim,command-line,sed,awk,Sorting,Vim,Command Line,Sed,Awk,我使用Linux,将我的联系人存储在一个文本文件中,格式如下,用一行5星号分隔。我使用Vim打开并执行基本搜索。随着文件大小的增加,我想按“标签”或“跟进日期”对联系人进行排序。我把这些记录当作是在索引卡上。这种格式可能对我的目的来说是最好的,也可能不是最好的,所以我愿意接受一些提示 *****$ Name: Company A$ Email: companya@mail.com$ Phone: 555-555-5555$ Address:$ Business Type: Medical$ No
*****$
Name: Company A$
Email: companya@mail.com$
Phone: 555-555-5555$
Address:$
Business Type: Medical$
Notes:$
Follow Up Date: 12/05/2013$
Tag: Tag6$
*****$
Name: Company B $
Email: companyb@mail.com$
Phone: 666-666-6666$
Address:$
Business Type: Food$
Notes:$
Follow Up Date: 12/03/2013$
Tag: Tag7$
*****$
我低估了Sed用于数据流,而Awk用于delmited字段。我正在学习使用这两种方法,但到目前为止还无法达到预期的效果。我也在学习使用排序,基本上是从命令行处理我的文件
有人可以帮助我在Vim中或从命令行中按“标记”或“跟进日期”对记录进行排序吗
谢谢大家这可能不是一个完美的答案,但请尝试重新格式化信息。将地址卡中的所有信息保存在具有固定长度或制表符/逗号分隔字段的单个记录中。然后,您将能够在任何字段上对其进行排序。例如:
|Rec0001|Name1 |email1@email.com |091-909090990 | ......|tag1 |tag2
|Rec0002|Name2 |email2@email2.com |091-909090991 | ......|tagx |tagy
这可能不是一个完美的答案,但请尝试重新格式化信息。将地址卡中的所有信息保存在具有固定长度或制表符/逗号分隔字段的单个记录中。然后,您将能够在任何字段上对其进行排序。例如:
|Rec0001|Name1 |email1@email.com |091-909090990 | ......|tag1 |tag2
|Rec0002|Name2 |email2@email2.com |091-909090991 | ......|tagx |tagy
这可能不是一个完美的答案,但请尝试重新格式化信息。将地址卡中的所有信息保存在具有固定长度或制表符/逗号分隔字段的单个记录中。然后,您将能够在任何字段上对其进行排序。例如:
|Rec0001|Name1 |email1@email.com |091-909090990 | ......|tag1 |tag2
|Rec0002|Name2 |email2@email2.com |091-909090991 | ......|tagx |tagy
这可能不是一个完美的答案,但请尝试重新格式化信息。将地址卡中的所有信息保存在具有固定长度或制表符/逗号分隔字段的单个记录中。然后,您将能够在任何字段上对其进行排序。例如:
|Rec0001|Name1 |email1@email.com |091-909090990 | ......|tag1 |tag2
|Rec0002|Name2 |email2@email2.com |091-909090991 | ......|tagx |tagy
我终于明白OP需要按后续日期对记录(段落)进行排序,而不是每行排序 下面是我根据OP的要求制作的示例源文件
$ cat file
*****
Name: A
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 12/03/2013
Tag: Tag1, Tag1, Tag3
*****
Name: B
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 2/28/2014
Tag: Tag1, Tag1, Tag3
*****
以下是使用后续日期对两条记录进行排序的命令:
awk '{gsub(/\n/,"|")}1' RS="*+\n" file |sort -hr|awk '{gsub(/\|/,"\n");print "*****" RS $0}'
*****
Name: B
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 2/28/2014
Tag: Tag1, Tag1, Tag3
*****
Name: A
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 12/03/2013
Tag: Tag1, Tag1, Tag3
*****
解释
1) 第一个awk命令将每个记录转换为一行:
awk '{gsub(/\n/,"|")}1' RS="*+\n" file
Name: A|Email:|Phone:|Address:|Business Type:|Notes:|Follow Up Date: 12/03/2013 |Tag: Tag1, Tag1, Tag3|
Name: B|Email:|Phone:|Address:|Business Type:|Notes:|Follow Up Date: 2/28/2014|Tag: Tag1, Tag1, Tag3|
2) sort-h
对比较人类可读数字的记录进行排序
3) 第二个awk用于将记录转换回其原始格式。我终于明白OP需要按后续日期对记录(段落)进行排序,而不是每行排序
下面是我根据OP的要求制作的示例源文件
$ cat file
*****
Name: A
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 12/03/2013
Tag: Tag1, Tag1, Tag3
*****
Name: B
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 2/28/2014
Tag: Tag1, Tag1, Tag3
*****
以下是使用后续日期对两条记录进行排序的命令:
awk '{gsub(/\n/,"|")}1' RS="*+\n" file |sort -hr|awk '{gsub(/\|/,"\n");print "*****" RS $0}'
*****
Name: B
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 2/28/2014
Tag: Tag1, Tag1, Tag3
*****
Name: A
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 12/03/2013
Tag: Tag1, Tag1, Tag3
*****
解释
1) 第一个awk命令将每个记录转换为一行:
awk '{gsub(/\n/,"|")}1' RS="*+\n" file
Name: A|Email:|Phone:|Address:|Business Type:|Notes:|Follow Up Date: 12/03/2013 |Tag: Tag1, Tag1, Tag3|
Name: B|Email:|Phone:|Address:|Business Type:|Notes:|Follow Up Date: 2/28/2014|Tag: Tag1, Tag1, Tag3|
2) sort-h
对比较人类可读数字的记录进行排序
3) 第二个awk用于将记录转换回其原始格式。我终于明白OP需要按后续日期对记录(段落)进行排序,而不是每行排序
下面是我根据OP的要求制作的示例源文件
$ cat file
*****
Name: A
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 12/03/2013
Tag: Tag1, Tag1, Tag3
*****
Name: B
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 2/28/2014
Tag: Tag1, Tag1, Tag3
*****
以下是使用后续日期对两条记录进行排序的命令:
awk '{gsub(/\n/,"|")}1' RS="*+\n" file |sort -hr|awk '{gsub(/\|/,"\n");print "*****" RS $0}'
*****
Name: B
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 2/28/2014
Tag: Tag1, Tag1, Tag3
*****
Name: A
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 12/03/2013
Tag: Tag1, Tag1, Tag3
*****
解释
1) 第一个awk命令将每个记录转换为一行:
awk '{gsub(/\n/,"|")}1' RS="*+\n" file
Name: A|Email:|Phone:|Address:|Business Type:|Notes:|Follow Up Date: 12/03/2013 |Tag: Tag1, Tag1, Tag3|
Name: B|Email:|Phone:|Address:|Business Type:|Notes:|Follow Up Date: 2/28/2014|Tag: Tag1, Tag1, Tag3|
2) sort-h
对比较人类可读数字的记录进行排序
3) 第二个awk用于将记录转换回其原始格式。我终于明白OP需要按后续日期对记录(段落)进行排序,而不是每行排序
下面是我根据OP的要求制作的示例源文件
$ cat file
*****
Name: A
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 12/03/2013
Tag: Tag1, Tag1, Tag3
*****
Name: B
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 2/28/2014
Tag: Tag1, Tag1, Tag3
*****
以下是使用后续日期对两条记录进行排序的命令:
awk '{gsub(/\n/,"|")}1' RS="*+\n" file |sort -hr|awk '{gsub(/\|/,"\n");print "*****" RS $0}'
*****
Name: B
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 2/28/2014
Tag: Tag1, Tag1, Tag3
*****
Name: A
Email:
Phone:
Address:
Business Type:
Notes:
Follow Up Date: 12/03/2013
Tag: Tag1, Tag1, Tag3
*****
解释
1) 第一个awk命令将每个记录转换为一行:
awk '{gsub(/\n/,"|")}1' RS="*+\n" file
Name: A|Email:|Phone:|Address:|Business Type:|Notes:|Follow Up Date: 12/03/2013 |Tag: Tag1, Tag1, Tag3|
Name: B|Email:|Phone:|Address:|Business Type:|Notes:|Follow Up Date: 2/28/2014|Tag: Tag1, Tag1, Tag3|
2) sort-h
对比较人类可读数字的记录进行排序
3) 第二个awk用于将记录转换回原始格式。我提出了一个类似于@BMW答案的vim方法。两者并不完全相同:如果我正确阅读@BMW的解决方案,那么它将被其他字段中的数字所混淆;vim的:sort
具有有限的数值选项。(如果要按日期排序,则使用类似于yyyyymmdd
的格式(无标点符号)会更简单。)
注:
我使用了不受欢迎的\V
修饰符(非常没有魔力),因此*不被视为特殊字符
无论您使用awk还是vim,您都可能希望使用比|更独特的东西
如果文件末尾有一个空行,则:g
命令将正常工作。如果您不喜欢它,您可以在这个过程中添加和删除它
使用:sort/| Tag://
按标签排序,而不是按后续日期排序
我想出了一个vim方法,类似于@BMW的答案。两者并不完全相同:如果我正确阅读@BMW的解决方案,那么它将被其他字段中的数字所混淆;vim的:sort
具有有限的数值选项。(如果要按日期排序,则使用类似于yyyyymmdd
的格式(无标点符号)会更简单。)
注:
我使用了不受欢迎的\V
修饰符(非常没有魔力),因此*不被视为特殊字符
无论您使用awk还是vim,您都可能希望使用比|更独特的东西
如果文件末尾有一个空行,则:g
命令将正常工作。如果您不喜欢它,您可以在这个过程中添加和删除它
使用:sort/| Tag://
按标签排序,而不是按后续日期排序
我想出了一个vim方法,类似于@BMW的答案。两者并不完全相同:如果我正确阅读@BMW的解决方案,那么它将被其他字段中的数字所混淆;vim的:sort
具有有限的数值选项。(如果要按日期排序,则使用类似于yyyyymmdd
的格式(无标点符号)会更简单。)