仅对 awk 中的第一列进行子字符串化

Len*_*ran 4 awk

我想使用 awk 取第一列的前 500 个字符,并将其余列保持原样。

这就是我想要做的:

awk '{print ${$1:1:500} $2,$NF;}' doc.txt
Run Code Online (Sandbox Code Playgroud)

但我收到语法错误:

awk: {print ${$1:1:500} $2,$NF;}
awk:         ^ syntax error
awk: {print ${$1:1:500} $2,$NF;}
awk:                           ^ syntax error
Run Code Online (Sandbox Code Playgroud)

Chr*_*own 13

您试图将(无效的)bash 下标语法传递给 awk,但 awk 不是 bash。这是做你想做的一种方法:

awk '{ $1 = substr($1, 1, 500) } 1'
Run Code Online (Sandbox Code Playgroud)

1只是返回 true 以便 awk 打印行的一种方式,substr()是执行子字符串的实际调用。从文档:

substr(字符串,开始,长度)

这将返回字符串的长度为字符长的子字符串,从字符号开始。字符串的第一个字符是第一个字符。

例如, substr("washington", 5, 3) 返回 "ing"。如果 length 不存在,则此函数返回从字符编号开始的字符串的整个后缀。例如, substr("washington", 5) 返回 "ington"。如果长度大于字符串中剩余的字符数(从字符数开始计算),情况也是如此。

如果需要保留字段分隔符,请OFS适当设置。