bash - gsub 与 awk 按名称对文件进行处理

标签 bash awk gsub

我正在尝试学习如何将 awk 与 gsub 用于特定字段,但传递名称,而不是此数据的列号:

especievalida,nom059
Rhizophora mangle,Amenazada (A)
Avicennia germinans,Amenazada (A)
Laguncularia racemosa,Amenazada (A)
Cedrela odorata,Sujeta a protección especial (Pr)
Litsea glaucescens,En peligro de extinción (P)
Conocarpus erectus,Amenazada (A)
Magnolia schiedeana,Amenazada (A)
Carpinus caroliniana,Amenazada (A)
Ostrya virginiana,Sujeta a protección especial (Pr)

我试过了

awk -F, -v OFS=","   '{gsub("\\(.*\\)", "", $2 ) ; print $0}' 

删除第二列($2)括号内的所有内容;但我真的希望能够将“nom059”传递给表达式,以获得相同的结果

最佳答案

读取输入文件的第一行(标题行)时,构建一个数组(下面的 f[]),将字段名称映射到字段编号。然后,您只需使用字段的名称作为 f[] 的索引即可访问这些字段,以获取其编号和内容:

$ cat tst.awk
BEGIN {
    FS = OFS = ","
}
NR==1 {
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
}
{
    gsub(/\(.*\)/,"",$(f["nom05"]))
    print
}

$ awk -f tst.awk file
especievalida,nom059
Rhizophora mangle,Amenazada
Avicennia germinans,Amenazada
Laguncularia racemosa,Amenazada
Cedrela odorata,Sujeta a protección especial
Litsea glaucescens,En peligro de extinción
Conocarpus erectus,Amenazada
Magnolia schiedeana,Amenazada
Carpinus caroliniana,Amenazada
Ostrya virginiana,Sujeta a protección especial

顺便说一下,请阅读https://www.gnu.org/software/gawk/manual/gawk.html#Computed-Regexps为什么您应该使用 gsub(/.../ (常量或文字正则表达式)而不是 gsub("..." (动态或计算正则表达式) .

关于bash - gsub 与 awk 按名称对文件进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57893307/

相关文章:

regex - 正则表达式 : bash 3 vs bash 4

linux - bash脚本中带有特殊字符的参数

linux - 如何按顺序打印包含某些字符串的行?

linux - 使用 Sed 将文本附加到现有的第一行

linux - 如何根据多个不同列的值递增对多个值范围进行排序?

r - 如何根据 R 中的其他列删除字符串的一部分?

Lua:在 string.gsub 中转义文字 % 并捕获 %2

r - 如何在 gsub 替换中使用通配符

Bash、无参数警告和案例决定

awk - 使用 awk 查找大于或等于 0.021 到 0 的值