88. 通用字符串函数


以下是所有 awk 版本中都可用的常见 awk 字符串函数。

index 函数可用于获取输入字符串中给定字符串(或字符)的索引(位置)。

在以下示例中,字符串 "Cali" 位于字符串 "CA is California" 中的位置编号 7 处。

您还可以使用索引来检查给定字符串(或字符)是否存在于输入字符串中。如果给定的字符串不存在,则返回位置为 0,这意味着给定的字符串不存在,如下所示。

$ cat index.awk
BEGIN {
    state="CA is California"
    print "String CA starts at location",index(state,"CA");
    print "String Cali starts at location",index(state,"Cali");
    if (index(state,"NY")==0)
        print "String NY is not found in:", state
}

$ awk -f index.awk
String CA starts at location 1
String Cali starts at location 7
String NY is not found in: CA is California 

length 函数返回字符串的长度。在下面的示例中,我们打印 「items.txt」 文件的每条记录中的字符总数

$ awk '{print length($0)}' items.txt
29
32
27
31
30

语法:

split(input-string,output-array,separator) 

split 函数将字符串拆分为单独的数组元素。 它需要以下三个参数。

  • input-string:这是需要拆分为多个字符串的输入字符串。
  • output-array:该数组将包含分割字符串作为单独的元素
  • separator:用于分割输入字符串的分隔符。

对于此示例,原始 「items-sold.txt」 文件略有更改,以具有不同的字段分隔符,即用于分隔商品编号和销售数量的冒号。 在销售数量中,各个数量以逗号分隔。

因此,为了让我们计算特定商品的销售总数,我们应该采用第二个字段(即所有以逗号分隔的销售数量),使用逗号分隔符分割它们并将子字符串存储在数组中,然后循环遍历数组以添加数量。

$ cat items-sold1.txt
101:2,10,5,8,10,12
102:0,1,4,3,0,2
103:10,6,11,20,5,13
104:2,3,4,0,6,5
105:10,2,5,7,12,6

$ cat split.awk
BEGIN {
    FS=":"
}
{
    split($2,quantity,",");
    total=0;
    for (x in quantity)
        total=total+quantity[x];
    print "Item", $1, ":", total, "quantities sold";
} 

$ awk -f split.awk items-sold1.txt
Item 101 : 47 quantities sold
Item 102 : 10 quantities sold
Item 103 : 65 quantities sold
Item 104 : 20 quantities sold
Item 105 : 42 quantities sold

语法:

substr(input-string, location, length)

substr 函数提取给定字符串的一部分。在上面的语法中:

  • input-string:包含子字符串的输入字符串。
  • location:子字符串的起始位置。
  • length:从起始位置提取的字符总数。 该参数是可选的。 如果您未指定,它将从起始位置提取其余字符。

以下示例从第 5 个字符开始提取字符串并打印该行的其余部分。前 3 个字符是项目编号,第 4 个字符是逗号分隔符。因此,这会跳过项目编号并打印其余部分。

$ awk '{print substr($0,5)}' items.txt
HD Camcorder,Video,210,10
Refrigerator,Appliance,850,2
MP3 Player,Audio,270,15
Tennis Racket,Sports,190,20
Laser Printer,Office,475,5

从第一个字符(第二个字段)开始并打印 5 个字符:

$ awk -F"," '{print substr($2,1,5)}' items.txt
HD Ca
Refri
MP3 P
Tenni
Laser