4

我想我的一般问题是,是否可以给 awk 一个字段分隔符,将其中一个标记存储在一个变量中,然后给 awk 另一个字段分隔符,并将其中一个标记存储在第二个变量中,然后打印出来变量值?似乎变量存储了对 $nth 标记的引用,而不是值本身。

我想到的具体例子或多或少遵循这种形式:{An​​imal}, {species} class

Cat, Felis catus MAMMAL
Dog, Canis lupus familiaris MAMMAL
Peregrine Falcon, Falco peregrinus AVIAN
...

并且您希望它输出如下内容:

Cat MAMMAL
Dog MAMMAL
Peregrine Falcon AVIAN
...

你想要的是符合以下形式的东西:{Animal} 类

用 {} 括起来的东西意味着它可以有任意数量的空格。

我最初的想法是我会有这样的事情:

cat test.txt | awk '{FS=","}; {animal=$1}; {FS=" "}; {class=$NF}; {print animal, class}; > animals.txt

我希望变量“动物”存储逗号左侧的内容,而“类”具有该动物的类类型,例如 MAMMAL 等。但最终发生的是只有最后使用的字段分隔符是已应用,因此对于名称中包含空格的事物(例如 Peregrine Falcon 等),这将中断。

所以它看起来像

Cat, MAMMAL
Dog, MAMMAL
Peregrine AVIAN
4

4 回答 4

6

一种使用方式awk

awk -F, '{ n = split($2,array," "); printf "%s, %s\n", $1, array[n] }' file.txt

结果:

Cat, MAMMAL
Dog, MAMMAL
Peregrine Falcon, AVIAN
于 2012-08-21T02:27:05.930 回答
3

你总是可以split()在你的 awk 脚本中。您还可以操作导致整行被重新解析的字段。例如,这会在您的问题中得到结果:

awk '{cl=$NF; split($0,a,", "); printf("%s, %s\n", a[1], cl)}' test.txt
于 2012-08-21T02:30:06.200 回答
3

字段分隔符awk可以是任何正则表达式,但在这种情况下,使用记录分隔符可能更容易,将其设置为[,\n]将在您想要的字段之间交替:

awk -v RS='[,\n]' 'NR % 2 { printf("%s, ", $0) } NR % 2 == 0 { print $NF }'

因此偶数字段完整输出,奇数字段仅输出最后一个字段。

于 2012-08-21T08:14:11.280 回答
2
paste -d, <(cut -d, -f1 input.txt) <(awk '{print $NF}' input.txt)
  • cut第一列
  • awk获取最后一列
  • paste他们在一起

输出:

Cat,MAMMAL
Dog,MAMMAL
Peregrine Falcon,AVIAN
于 2012-08-21T02:33:57.463 回答