如何将awk命令仅应用于特定字段



我在以下位置找到了问题的部分解决方案:"用awk"改变字符串的大小写";,@AndersJohansson发布的命令是:

echo 'ABCD EFGH IJKL MNOP QRST UVWX' | awk '{for (i=1; i<=NF; ++i) { $i=toupper(substr($i,1,1)) tolower(substr($i,2)); } print }'

按预期结束打印Abcd Efgh Ijkl Mnop Qrst Uvwx。但是,在我的例子中,我有用字段分隔的数据,比如:ABCD EFGH; IJKL MNOP; QRST UVWX,我只需要将命令应用于第3r(最后一个(字段(实际上,在数据中有9个字段,但为了简单起见,我只放了3个(。

预期输出:ABCD EFGH; IJKL MNOP; Qrst Uvwx

在Stackoverflow中有很多相关的问题,甚至是我自己的一个问题(如何在awk捕获的细胞内进行排序(,我一个接一个地试图将它们适应我的情况,但没有成功,显然我对awk没有足够的了解,无法用解决方案来克服,所以我真的很感激在解决这个问题上的任何帮助。。。谢谢

也许是这样的:

echo "ABCD EFGH; IJKL MNOP; QRST UVWX" |
awk '
BEGIN { FS = OFS = "; "}
{
s = "";
n = split($NF,w,/ /);
for(i=1; i<=n; ++i)
s = s " " toupper(substr(w[i],1,1)) tolower(substr(w[i],2))
}
{$NF = substr(s,2)}
1
'

输出:

ABCD EFGH; IJKL MNOP; Qrst Uvwx
解释:
  • FS设置为": "将使awk在由": "分隔的字段中分割行;在当前情况下,您将得到三个字段。

  • $NF引用最后一个字段,然后在每个空格字符上手动拆分该字段。

  • for循环执行上/下转换,并将它们存储在字符串变量中。

  • 然后更新最后一个字段并打印整行;OFS必须设置为与FS相同的值,否则打印行时"; "将转换为" "

最新更新