Awk 将行输出到与第n列同名的文件

Awk 将行输出到与第n列同名的文件,awk,Awk,假设我有这个 24 Monkey 86 Cat 5743 Fish 6 Dog abc Monkey 76 Dog 56 Dog 44 Fish vfg Dog f45 Cat 使用第二列,我想将行输出到一个同名的文件,如果需要的话创建它 猴子 24 Monkey 86 Cat abc Monkey 76 Dog 鱼 狗 我希望处理无限可能的名称,而不是像这样手动指定它们 awk '{ if ( $2=="dog" ) { print $0; } }'

假设我有这个

24  Monkey  86  Cat
5743    Fish    6   Dog
abc Monkey  76  Dog
56  Dog 44  Fish
vfg Dog f45 Cat
使用第二列,我想将行输出到一个同名的文件,如果需要的话创建它

猴子

24  Monkey  86  Cat
abc Monkey  76  Dog

我希望处理无限可能的名称,而不是像这样手动指定它们

awk '{ if ( $2=="dog" ) { print $0; } }'

不确定如何使用$2作为输出文件名。有可能吗?

请尝试以下内容

awk '
{
  close(out_file)
  out_file=$2
  print >> (out_file)
}
' Input_file

这会达到你的目的

#!/bin/bash

for animal in $( awk '{ print $2}' animals.txt | sort | sort -u )
do
    awk -v animal="$animal" '$2 == animal{print $0}' animals.txt > "${animal}_list.txt"
done

希望有帮助

关闭
是很好的卫生措施,但如果只有少量输出文件,则会不必要地降低速度。可以同时打开的文件句柄数量的精确限制取决于系统,但我相信一个典型的值大约是12个。假设不重用工作区,在这种情况下,您会一直附加到以给定动物命名的文件。请记住,在Linux中,文件名区分大小写,所以dog和dog将在两个不同的输出中。@tripleee,谢谢您,先生,谢谢您的反馈,我实际上想使用if条件来检查前一个字段是否与当前字段不相同,然后关闭文件,但在每一行上都会进行检查,所以每次在这里选择关闭它
awk '
{
  close(out_file)
  out_file=$2
  print >> (out_file)
}
' Input_file
#!/bin/bash

for animal in $( awk '{ print $2}' animals.txt | sort | sort -u )
do
    awk -v animal="$animal" '$2 == animal{print $0}' animals.txt > "${animal}_list.txt"
done