将参数从shell脚本传递给awk

时间:2013-09-19 04:30:47

标签: linux shell awk

我想按行数分割我的文本文件

GenTextFile.txt有3000行,我想拆分为

GenText_Output_1.txt>> 1000行(第1 - 1000行)

GenText_Output_2.txt>> 1000行(1001行 - 2000行)

GenText_Output_3.txt>> 1000行(2001 - 3000行)

从控制台获取3个参数输入是输入名称,输出名称,要分割的行数

但是当我执行时,它有一个问题

/devhome/See/Split_file > ./shell_call_awk.sh GenTextFile.txt GenText_Output  1000
awk: syntax error near line 1
awk: bailing out near line 1
awk: can't open in_name

我做错了吗?

- 这是我的代码 -

#!/bin/ksh

#echo "input name : $1"
#echo "output name : $2"
#echo "line split : $3"

input_name=$1
output_name=$2
line_split=$3

awk -v "in_name=$input_name" -v "out_name=$output_name" -v "line=$line_split"
awk 'NR%line==1{x=++i;}{print > out_name"_"x".txt"}' in_name

exit 1;

感谢。

2 个答案:

答案 0 :(得分:3)

您只需要一个awk命令,而不是两个单独的命令。输入文件不需要是一个awk变量,它只是一个命令行参数。

awk -v "out_name=$output_name" -v "line=$line_split" 'NR%line==1{x=++i;}{print > (out_name"_"x".txt")}' "$input_name"

您也可以使用split命令(这需要GNU coreutils的版本):

split --numeric-suffixes --lines=$line_split "$input_name" "$output_name"_

答案 1 :(得分:0)

我试着跟随,但问题仍然存在。

awk: syntax error near line 1.
awk: bailing out near line 1.

我找到了解决方案here

Solaris is well known for the fact that the some commands under /bin /usr/bin are not POSIX compliant. Instead they have additional compliant versions under /usr/xpg4 and similar hierarchies.

Thus, under Solaris you can use just:

/usr/xpg4/bin/awk -v NAME=MACHINE '$1 == NAME'  /etc/hosts 

Under Solaris 10 this works.

当我使用命令man awk时,我发现我正在运行SunOS 5.9。

然后我将awk替换为usr/xpg4/bin/awk

有效!

@Barmar非常感谢您对awk命令行的建议。

- 这是我的代码 -

input_name=$1
output_name=$2
line_split=$3

/usr/xpg4/bin/awk -v "out_name=$output_name" -v "line=$line_split" 'NR%line==1{x=++i;}{print > out_name""x".txt"}' ${input_name}