我正在尝试使用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 - 要过滤的文件,假设文件中没有名称 只有数字而且所有格式都相同。
答案 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