在 AWK 命令中从配置文件传递输入参数
Passing input parameter from a config file in AWK command
我是 unix shell 脚本的新手。
我需要解析固定长度的数据文件并转换为逗号分隔符。
我设法做到这一点。通过使用以下代码:
awk '{
one=substr([=10=],1,1)
two=substr([=10=],2,10)
three=substr([=10=],12,4)
four=substr([=10=],16,2)
rest=substr([=10=],18)
printf ("%s,%s,%s,%s,%s\n", one, two, three, four, rest)
}' data.txt > out.txt
Data.txt:
k12582927001611USNA
k12582990001497INAS
k12583053001161LNEU
Output.txt:
k,1258292700,1611,US,NA
k,1258299000,1497,IN,AS
k,1258305300,1161,LN,EU
问题是我需要阅读
配置文件中的列位置。
我的配置文件 (configfile.txt) 如下:
one=substr([=13=],1,1)
two=substr([=13=],2,10)
three=substr([=13=],12,4)
four=substr([=13=],16,2)
rest=substr([=13=],18)
为了满足要求,我创建了如下脚本:
configparam=`cat configfile.txt`
awk '{
$configparam
printf ("%s,%s,%s,%s,%s\n", one, two, three, four, rest)
}' data.txt > out.txt
但它不起作用。这里有人可以告诉我实现此目标的正确方法吗?
我已将其重组为
cat cfg.awk
{
one=substr([=10=],1,1)
two=substr([=10=],2,10)
three=substr([=10=],12,4)
four=substr([=10=],16,2)
rest=substr([=10=],18)
}
cat printer.awk
{ printf ("%s,%s,%s,%s,%s\n", one, two, three, four, rest) }
运行 作为
awk -f cfg.awk -f printer.awk data.txt
输出
k,1258292700,1611,US,NA
k,1258299000,1497,IN,AS
k,1258305300,1161,LN,EU
唯一的区别是您需要在 var=substr
代码周围添加 opening/closing { .. }
(大括号)。
IHTH
一个最简单的方法是创建文件,其中包含位置开始和字符数,如下所示,您不必写那么多时间one=substr([=14=],start,n_char);
:
输入:
$ cat infile
k12582927001611USNA
k12582990001497INAS
k12583053001161LNEU
位置文件:
$ cat pos
1,1
2,10
12,4
16,2
18
一行:
$ awk 'BEGIN{FS=OFS=","}FNR==NR{pos[++i,"s"]=;pos[i,"e"]=+0?:length;next}{for(j=1; j<=i; j++) printf("%s%s", substr([=12=],pos[j,"s"],pos[j,"e"]),j==i?ORS:OFS)}' pos infile
k,1258292700,1611,US,NA
k,1258299000,1497,IN,AS
k,1258305300,1161,LN,EU
可读性更好:
awk 'BEGIN{
FS=OFS=","
}
FNR==NR{
pos[++i,"s"]=;
pos[i,"e"]=+0?:length;
next
}
{
for(j=1; j<=i; j++)
printf("%s%s", substr([=13=],pos[j,"s"],pos[j,"e"]),j==i?ORS:OFS)
}' pos infile
以下 awk 也可能对您有所帮助。
awk '
function check(val, re){
split(val, array,",");
re=array[1] && array[2]?substr([=10=],array[1],array[2]):substr([=10=],array[1]);
return re
}
FNR==NR{
match([=10=],/\(.*\)/);
a[FNR]=substr([=10=],RSTART+4,RLENGTH-5);
count++;
next}
{
for(i=1;i<=count;i++){
val=val?val "," check(a[i]):check(a[i])
};
print val;
val=""
}
' Input_file_config Input_file
输出如下。
k,1258292700,1611,US,NA
k,1258299000,1497,IN,AS
k,1258305300,1161,LN,EU
我是 unix shell 脚本的新手。 我需要解析固定长度的数据文件并转换为逗号分隔符。 我设法做到这一点。通过使用以下代码:
awk '{
one=substr([=10=],1,1)
two=substr([=10=],2,10)
three=substr([=10=],12,4)
four=substr([=10=],16,2)
rest=substr([=10=],18)
printf ("%s,%s,%s,%s,%s\n", one, two, three, four, rest)
}' data.txt > out.txt
Data.txt:
k12582927001611USNA
k12582990001497INAS
k12583053001161LNEU
Output.txt:
k,1258292700,1611,US,NA
k,1258299000,1497,IN,AS
k,1258305300,1161,LN,EU
问题是我需要阅读 配置文件中的列位置。
我的配置文件 (configfile.txt) 如下:
one=substr([=13=],1,1)
two=substr([=13=],2,10)
three=substr([=13=],12,4)
four=substr([=13=],16,2)
rest=substr([=13=],18)
为了满足要求,我创建了如下脚本:
configparam=`cat configfile.txt`
awk '{
$configparam
printf ("%s,%s,%s,%s,%s\n", one, two, three, four, rest)
}' data.txt > out.txt
但它不起作用。这里有人可以告诉我实现此目标的正确方法吗?
我已将其重组为
cat cfg.awk
{
one=substr([=10=],1,1)
two=substr([=10=],2,10)
three=substr([=10=],12,4)
four=substr([=10=],16,2)
rest=substr([=10=],18)
}
cat printer.awk
{ printf ("%s,%s,%s,%s,%s\n", one, two, three, four, rest) }
运行 作为
awk -f cfg.awk -f printer.awk data.txt
输出
k,1258292700,1611,US,NA
k,1258299000,1497,IN,AS
k,1258305300,1161,LN,EU
唯一的区别是您需要在 var=substr
代码周围添加 opening/closing { .. }
(大括号)。
IHTH
一个最简单的方法是创建文件,其中包含位置开始和字符数,如下所示,您不必写那么多时间one=substr([=14=],start,n_char);
:
输入:
$ cat infile
k12582927001611USNA
k12582990001497INAS
k12583053001161LNEU
位置文件:
$ cat pos
1,1
2,10
12,4
16,2
18
一行:
$ awk 'BEGIN{FS=OFS=","}FNR==NR{pos[++i,"s"]=;pos[i,"e"]=+0?:length;next}{for(j=1; j<=i; j++) printf("%s%s", substr([=12=],pos[j,"s"],pos[j,"e"]),j==i?ORS:OFS)}' pos infile
k,1258292700,1611,US,NA
k,1258299000,1497,IN,AS
k,1258305300,1161,LN,EU
可读性更好:
awk 'BEGIN{
FS=OFS=","
}
FNR==NR{
pos[++i,"s"]=;
pos[i,"e"]=+0?:length;
next
}
{
for(j=1; j<=i; j++)
printf("%s%s", substr([=13=],pos[j,"s"],pos[j,"e"]),j==i?ORS:OFS)
}' pos infile
以下 awk 也可能对您有所帮助。
awk '
function check(val, re){
split(val, array,",");
re=array[1] && array[2]?substr([=10=],array[1],array[2]):substr([=10=],array[1]);
return re
}
FNR==NR{
match([=10=],/\(.*\)/);
a[FNR]=substr([=10=],RSTART+4,RLENGTH-5);
count++;
next}
{
for(i=1;i<=count;i++){
val=val?val "," check(a[i]):check(a[i])
};
print val;
val=""
}
' Input_file_config Input_file
输出如下。
k,1258292700,1611,US,NA
k,1258299000,1497,IN,AS
k,1258305300,1161,LN,EU