我需要帮助。我有文件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
我明白这是不正确的,但我没有想法
答案 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