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 从命令行对文本记录进行排序_Sorting_Vim_Command Line_Sed_Awk - Fatal编程技术网

Sorting 从命令行对文本记录进行排序

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

我使用Linux,将我的联系人存储在一个文本文件中,格式如下,用一行5星号分隔。我使用Vim打开并执行基本搜索。随着文件大小的增加,我想按“标签”或“跟进日期”对联系人进行排序。我把这些记录当作是在索引卡上。这种格式可能对我的目的来说是最好的,也可能不是最好的,所以我愿意接受一些提示

*****$
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
    的格式(无标点符号)会更简单。)