AWK - 从命令行传递生成的字符串作为awk的代码

时间:2014-06-09 10:10:08

标签: bash unix awk ksh

我正在尝试使用awk动态打印文件的选定字段。

基本上,问题是为什么这个有效:

awk -F';' '{print $3 ";" $4 ";" }' file

但这不是:

awk -F';' '{print '`echo '$3 ";" $4 ";"'`' }' file

我的最终目标是将上述内容封装在一个命令中,以便我能够做到

my_cmd ';' 3 6 7 8 file(s)

应显示#3,6,7,8中由;分隔的字段file(s)

编辑我的帖子: 发现自己我的问题是回声插入当然是一个新的线路因素导致awk问题:o) \ c做了这个伎俩,还有一些“逃避必须做的事情(见下文)。”

awk -F';' '{print '"`echo '$3 \";\" $4 \";\"\c'`"' }' file(s)

现在我只能用命令来改变它,这将生成一个像字母一样的字符串 $2 ";' $5 ";' $6 ";' $9 ";"(数字和字段应为输入)等应在'{print '' }'

之间进行

感谢cbuckley我发现了我的一行命令:(问题解决了)。

cut -d"$1" -f `shift; echo $* | sed 's/[^ 0-9]\{1,\}.*$//;s/[ ]$//;s/[ ]\{1,\}/,/g'` `shift; printf "%s\n" $(echo $*) | grep -v '^[0-9]$'`

这里$ *是输入参数,如果上面将作为别名或.rc文件中名为sayc的函数,那么synopsys将是:

filterc delimiter column1 [column2 [column3...]] file1 [file2 [file3...]]  

其中:

分隔符 - 仅限一个字符

column1..n - 表示列

的数字

file1..n - 要过滤的文件,假设文件中没有名称 只有数字而且所有格式都相同。

3 个答案:

答案 0 :(得分:4)

您的命令听起来与cut非常相似:

cut -d ';' -f 1,3 <<EOT
one;two;three
foo;bar;quux
EOT

one;three
foo;quux

cut -d '-' -f 2,4 <<EOT
one-two-three-four
five-six-seven-eight
EOT

two-four
six-eight

答案 1 :(得分:3)

这就是你想要的吗?

#!/bin/bash

get_columns()
{
    local fs=$1; shift
    local _awk=
    local column

    for column; do
        _awk="${_awk}\$${column},"
    done
    awk -F"$fs" -v OFS="$fs" "{ print ${_awk%,} }"
}

get_columns ';' 1 3 <<EOT
one;two;three
foo;bar;quux
EOT

get_columns '-' 2 4 <<EOT
one-two-three-four
five-six-seven-eight
EOT

-

$ ./t.sh
one;three
foo;quux
two-four
six-eight

答案 2 :(得分:2)

function my_cmd {
    fs="$1"
    shift
    eval file="\$$#"
    awk -F"$fs" -v flds="$*" '
        BEGIN{ n=split(flds,f,/ /) }
        {
           for (i=1; i<n; i++)
               printf "%s%s", (i>1?FS:""), $(f[i])
           print ""
        }
    ' "$file"
}

$ cat file
a;b;c;d;e;f;g;h

$ my_cmd ';' 3 6 7 8 file                                                     
c;f;g;h

$ my_cmd ';' 6 3 8 file  
f;c;h