【问题标题】:awk - concatenate two string variable and assign to a thirdawk - 连接两个字符串变量并分配给第三个
【发布时间】:2015-01-17 16:25:41
【问题描述】:

在 awk 中,我有 2 个字段:$1 和 $2。

它们都是我想要连接并分配给变量的字符串。

【问题讨论】:

  • awk 如果我的输入是:Marty Pants,输出应该是一样的。不能改变FS

标签: awk gawk


【解决方案1】:

只需使用var = var1 var2,它就会自动连接变量var1var2

awk '{new_var=$1$2; print new_var}' file

您可以在两者之间放置一个空格:

awk '{new_var=$1" "$2; print new_var}' file

其实和使用FS是一样的,因为默认是空格:

awk '{new_var=$1 FS $2; print new_var}' file

测试

$ cat file
hello how are you
i am fine
$ awk '{new_var=$1$2; print new_var}' file
hellohow
iam
$ awk '{new_var=$1 FS $2; print new_var}' file
hello how
i am

您可以在 ideone 中使用它:http://ideone.com/4u2Aip

【讨论】:

  • 或者只是awk '{print $1$2}' file
  • 如何连接命名变量say a='aaa'; b='bbb' 你,可以操纵OFS变量。但是如果你想用常规的 OSF="\t"; 打印出其他字段呢? printf 是最佳选择吗?
  • @KeminZhou 不太清楚你的意思,但看起来sprintf() 可能会对你有所帮助。
【解决方案2】:

可以使用sprintf 来完成此操作:

awk '{str = sprintf("%s %s", $1, $2)} END {print str}' file

【讨论】:

  • 这是在 for 循环中将我的字符串连接为 pwd | awk -F/ '{for (i=1; i<NF; ++i) str=sprintf("%s/%s",str,$i)}END{print str}' 的完美解决方案
【解决方案3】:

您还可以使用空格连接多行中的字符串。

$ cat file.txt
apple 10
oranges 22
grapes 7

示例 1:

awk '{aggr=aggr " " $2} END {print aggr}' file.txt
10 22 7

示例 2:

awk '{aggr=aggr ", " $1 ":" $2} END {print aggr}' file.txt
, apple:10, oranges:22, grapes:7

【讨论】:

  • 有趣的是,这是我在 mawk 上工作的唯一方法(Ubuntu 上的默认 awk 实现)。
  • 通常使用可以对特定列的数字求和。在 END 处打印结果。
【解决方案4】:

awk中的字符串拼接可以通过打印命令AWK manual page来完成,还可以进行复杂的组合。在这里,我试图将 16 char 更改为 A 并使用字符串连接:

echo    CTCTCTGAAATCACTGAGCAGGAGAAAGATT | awk -v w=15 -v BA=A '{OFS=""; print substr($0, 1, w), BA, substr($0,w+2)}'
Output: CTCTCTGAAATCACTAAGCAGGAGAAAGATT

我使用 substr 函数来提取输入的一部分 (STDIN)。我传递了一些通常是 shell 变量的外部参数(这里我使用的是硬编码值)。在 shell 编程的上下文中,你可以写 -v w=$width -v BA=$my_charval。关键是 OFS,它代表 awk 中的输出字段分离。打印函数获取一个值列表并将它们写入 STDOUT 并将它们与 OFS 粘合。这类似于 perl 的连接函数。

看起来在 awk 中,字符串可以通过相邻打印变量来连接:

echo xxx | awk -v a="aaa" -v b="bbb" '{ print a b $1 "string literal"}'
# will produce: aaabbbxxxstring literal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多