使用AWK -F 多分隔符字符串 比如字符串为 RLTDP:MSC=ALL; 分割后为 RLTDP MSC ALL echo "RLTDP:MSC=ALL;"

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用AWK -F 多分隔符字符串 比如字符串为 RLTDP:MSC=ALL; 分割后为 RLTDP MSC ALL echo "RLTDP:MSC=ALL;"相关的知识,希望对你有一定的参考价值。

使用AWK -F 多分隔符字符串
比如字符串为 RLTDP:MSC=ALL;
想把串中RLTDP、MSC、ALL提取出来
echo "RLTDP:MSC=ALL;" | awk -F'[:=;]' 'print $1"|"$2"|"$3"|"$4'
执行后是 RLTDP:MSC=ALL;|||

和期望不符

参考技术A # echo "RLTDP:MSC=ALL;" | sed 's/^\(.*\):\(.*\)=\(.*\);$/\1 \2 \3/'
RLTDP MSC ALL

是这意思吗?追问

能分割,但是分出来的怎么取出来作为变量值使用?

追答

a=(`echo "RLTDP:MSC=ALL;" | sed 's/^\(.*\):\(.*\)=\(.*\);$/\1 \2 \3/'`)

把这三个值存成一个数组。

参考技术B 当有多个分隔符的时候,不能在外面直接用 -F,而是要用BEGINFS="[:=;]"

echo "RLTDP:MSC=ALL;" | awk 'BEGINFS="[:=;]"print $1"|"$2"|"$3'追问

想问一下,在你的平台上能正确显示出来吗?
我测试的平台是solaris,显示的结果是这样的
-bash-3.00$ echo "RLTDP:MSC=ALL;" | awk 'BEGINFS="[:=;]" print $1"|"$2"|"$3'
RLTDP:MSC=ALL;||

追答

我的是Ubuntu,可以啊。
$ echo "RLTDP:MSC=ALL;" | awk 'BEGINFS="[:=;]"print $1"|"$2"|"$3'
RLTDP|MSC|ALL

你原来的那个测试了下,也可以。

本回答被提问者和网友采纳

如何使用 sed/awk 替换逗号分隔字符串中的第 n 列/字段?

【中文标题】如何使用 sed/awk 替换逗号分隔字符串中的第 n 列/字段?【英文标题】:How to replace the nth column/field in a comma-separated string using sed/awk? 【发布时间】:2012-04-07 22:50:24 【问题描述】:

假设我有一个字符串

"1,2,3,4"

现在我想替换,例如字符串的第三个字段由一些不同的值。

"1,2,NEW,4"

我设法用以下命令做到了这一点:

echo "1,2,3,4" | awk -F, -v OFS=, '$3="NEW"; print '

现在要替换的列的索引应该作为变量传递。所以在这种情况下

index=3

如何将其传递给 awk?因为这行不通:

echo "1,2,3,4" | awk -F, -v OFS=, '$index="NEW"; print '
echo "1,2,3,4" | awk -F, -v OFS=, '$($index)="NEW"; print '
echo "1,2,3,4" | awk -F, -v OFS=, '\$$index="NEW"; print '

感谢您的帮助!

【问题讨论】:

【参考方案1】:

这可能对你有用:

index=3 
echo "1,2,3,4" | awk -F, -v OFS=, -v INDEX=$index '$INDEX="NEW"; print '

或:

index=3 
echo "1,2,3,4" | sed 's/[^,]*/NEW/'$index

【讨论】:

如果将“NEW”分配给一个变量怎么办?这不起作用:sed 's/[^,]*/$var/'$index @dcdum2018 注意双引号。 我尝试了这些:echo $line | awk -F, -v OFS=, -v INDEX=$index '$INDEX="$var"; print'echo $line | sed 's/[^,]*/$var/'$index,但实际上两者都替换为 $var @dcdum2018 单引号可防止插值,因此要么使用双引号,要么将 shell 变量放在单引号之外,例如sed "s/[^,]*/$var/$index" file1sed 's/[^,]*/'$var'/'$index file 效果很好!谢谢!如果不是很多,你能在这里看看我的问题吗? :) ***.com/questions/69751857/…【参考方案2】:

让 shell 在 awk 程序中插入索引:

echo "1,2,3,4" | awk -F, -v OFS=, '$'$index'="NEW"; print '

请注意最初的单引号 awk 程序是如何分成三部分的,单引号开头的 '$'、内插的索引值,然后是程序的单引号剩余部分。

【讨论】:

您可以使用-v var=value通过命令行在awk中定义一个变量,然后使用$var。所以不需要这个文本替换技巧。【参考方案3】:

这是打破awkwardness 的seductive 方法:

$ echo "1,2,3,4" | sed 's/,/\n/g' | sed -e $index's/.*/NEW/'

这很容易扩展到多个索引,只需添加另一个-e $newindex's/.*/NEWNEW/'

【讨论】:

如何将换行符转换回逗号分隔的列表?我试过 sed 's/\n/,/g' 但不行吗? @PeterMeier,我认为它不起作用,因为sed 现在将行分开处理,而不是整个文本。看过this answer后,我建议将输出通过管道传输到paste -sd ',',如下所示:echo "1,2,3,4" | sed 's/,/\n/g' | sed -e $index's/.*/NEW/' | paste -sd ','【参考方案4】:
# This should be faster than awk or sed.
str="1,2,3,4"
IFS=','
read -a f <<< "$str"
f[2]='NEW'
printf "$f[*]"

【讨论】:

【参考方案5】:

使用普通 awk(即不是 gawk 等)我相信您必须使用 split( string, array, [fieldsep] ); 更改选择的数组条目,然后将它们与 sprintf 或类似的循环连接在一起。

gawk 允许您将变量作为字段名称,在您的示例中为 $index。见here.

gawk 通常是 Linux 上的默认 awk,因此请将您的调用更改为 gawk “脚本”,看看它是否有效。

【讨论】:

以上是关于使用AWK -F 多分隔符字符串 比如字符串为 RLTDP:MSC=ALL; 分割后为 RLTDP MSC ALL echo "RLTDP:MSC=ALL;"的主要内容,如果未能解决你的问题,请参考以下文章

今日Bash和R技巧总结

awk 处理字符

如何在awk中将分隔字符串拆分为数组?

如何使用awk从后向前来截取字符串?

awk

linux shell awk 如何区分空格和tab