如何在bash awk中对文本中的一列应用程序?

我有一个文本,其中包含这样的内容,我想执行一个程序,将第2列中的所有文本转换为新的文本。

column1 column2 column3 column4
text1.1 text1.2 text1.3 text1.4
text2.2 text2.2 text2.3 text3.4

我想执行一个程序 将第2列中的所有文本转换为一个新的文本 这个程序接收stdin并返回stdout 所以它的调用是这样的: echo "text-to-transform" | myprogram,并返回 "transformed-text" 到stdout。

将myprogram应用于column2并在bash中显示输出的最简单方法是什么?

输出结果会是这样的

column1 column2 column3 column4
text1.1 transformed-text1.2 text1.3 text1.4
text2.2 transformed-text2.2 text2.3 text3.4

我猜测awk是一种方式,但我对它不够了解。

谅谅

解决方案:

$ cat tst.awk
BEGIN { myprogram = "tr [:lower:] [:upper:]" }
NR>1 {
    cmd = "printf \047%s\n\047, \047" $2 "\047 | " myprogram
    if ( (cmd | getline line) > 0 ) {
        $2 = line
    }
    close(cmd)
}
{ print }

$ awk -f tst.awk file
column1 column2 column3 column4
text1.1 TEXT1.2 text1.3 text1.4
text2.2 TEXT2.2 text2.3 text3.4

替换 myprogram = "tr [:lower:] [:upper:]"myprogram = "<whatever your real program is called>". 如果你喜欢,你甚至可以将其参数化。

$ cat tst.awk
NR>1 {
    cmd = "printf \047%s\n\047, \047" $col "\047 | " myprogram
    if ( (cmd | getline line) > 0 ) {
        $col = line
    }
    close(cmd)
}
{ print }

$ awk -v myprogram='tr [:lower:] [:upper:]' -v col=2 -f tst.awk file
column1 column2 column3 column4
text1.1 TEXT1.2 text1.3 text1.4
text2.2 TEXT2.2 text2.3 text3.4

$ awk -v myprogram='wc -c' -v col=2 -f tst.awk file
column1 column2 column3 column4
text1.1        9 text1.3 text1.4
text2.2        9 text2.3 text3.4

$ awk -v myprogram="sed 's/x/X/' | tr 't' '#'" -v col=3 -f tst.awk file
column1 column2 column3 column4
text1.1 text1.2 #eX#1.3 text1.4
text2.2 text2.2 #eX#2.3 text3.4

给TA打赏
共{{data.count}}人
人已打赏
未分类

Outlook 2019附件

2022-9-7 23:06:19

未分类

在访问成员之前检查对象是否为空,或者分配非空的替代对象。

2022-9-7 23:06:21

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索