如何用帮助awk划分列表

时间:2016-12-20 09:30:25

标签: bash

我需要帮助。我有文件vm.list:

VM-NAME1|WEEKDAY|2|
VM-NAME2|WEEKDAY|4|
VM-NAME3|WEEKDAY|3|
VM-NAME4|WEEKDAY|4|
VM-NAME5|WEEKDAY|4|
VM-NAME6|WEEKDAY|1|
VM-NAME7|WEEKDAY|1|
VM-NAME8|WEEKDAY|4|
VM-NAME9|WEEKDAY|2|
VM-NAME10|WEEKDAY|4|
VM-NAME11|WEEKDAY|4|

我需要将列表分成新列表,具体取决于3值和操作:

LIST1:
VM-NAME6
VM-NAME7

LIST2:
VM-NAME1
VM-NAME9

LIST3:
VM-NAME3

LIST4:
VM-NAME2
VM-NAME4
VM-NAME5
VM-NAME8
VM-NAME10
VM-NAME11

就是这样

for i in $(awk -F "|" '{print $3}' today.list | sort | uniq)
    do echo $i
    awk -F "|" '{ if ($3 == '$i') print $1 }' today.list
done

我明白这是不正确的,但我没有想法

3 个答案:

答案 0 :(得分:4)

试试这个awk单行:

awk -F'|' '{a[$3]=a[$3]RS$1}END{for(x in a)print "List"x":" a[x]}' file

答案 1 :(得分:0)

一个版本,要求源文件按cols 3和1排序(在进程替换中由sort处理)。

$ awk -F\| '{ print q ($3!=p?ORS "LIST" $3 ":":"") }{ p=$3; q=$1 }' <(sort -t\| -k3 -k1 file)

LIST1:
VM-NAME6
VM-NAME7
LIST2:
VM-NAME1
VM-NAME9
LIST3:
VM-NAME3
LIST4:
VM-NAME10
VM-NAME11
VM-NAME2
VM-NAME4
VM-NAME5

它不会将整个记录集存储在内存中。

答案 2 :(得分:0)

如果您希望输出位于名为List{1..4}的单独文件中,您可以使用:

$ awk -F'|' '{print $1 > "List" $3}' vm.list

$ head -n100 List* # just a quick hack to print them with a header...
==> List1 <==
VM-NAME6
VM-NAME7

==> List2 <==
VM-NAME1
VM-NAME9

==> List3 <==
VM-NAME3

==> List4 <==
VM-NAME2
VM-NAME4
VM-NAME5
VM-NAME8
VM-NAME10
VM-NAME11