我在以下位置找到了问题的部分解决方案:"用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
相同的值,否则打印行时"; "
将转换为" "
。