Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在AWK命令中从配置文件传递输入参数_Unix_Awk_Substr - Fatal编程技术网

Unix 在AWK命令中从配置文件传递输入参数

Unix 在AWK命令中从配置文件传递输入参数,unix,awk,substr,Unix,Awk,Substr,我不熟悉unixshell脚本。 我需要解析固定长度的数据文件并转换为逗号delimeter。 我设法做到了这一点。使用以下代码: awk '{ one=substr($0,1,1) two=substr($0,2,10) three=substr($0,12,4) four=substr($0,16,2) rest=substr($0,18) printf ("%s,%s,%s,%s,%s\n", one, two, three, four, rest) }' data.txt &

我不熟悉unixshell脚本。 我需要解析固定长度的数据文件并转换为逗号delimeter。 我设法做到了这一点。使用以下代码:

awk '{
 one=substr($0,1,1)
 two=substr($0,2,10)
 three=substr($0,12,4)
 four=substr($0,16,2)
 rest=substr($0,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($0,1,1)
two=substr($0,2,10)
three=substr($0,12,4)
four=substr($0,16,2)
rest=substr($0,18)
configparam=`cat configfile.txt`
awk '{
$configparam
printf ("%s,%s,%s,%s,%s\n", one, two, three, four, rest)
}' data.txt > out.txt
为了满足要求,我创建了如下脚本:

one=substr($0,1,1)
two=substr($0,2,10)
three=substr($0,12,4)
four=substr($0,16,2)
rest=substr($0,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($0,1,1)
   two=substr($0,2,10)
   three=substr($0,12,4)
   four=substr($0,16,2)
   rest=substr($0,18)
}
{ printf ("%s,%s,%s,%s,%s\n", one, two, three, four, rest) }
cat打印机.awk

{ 
   one=substr($0,1,1)
   two=substr($0,2,10)
   three=substr($0,12,4)
   four=substr($0,16,2)
   rest=substr($0,18)
}
{ 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
代码周围添加开头/结尾
{..}
(大括号)


一个最简单的方法是创建一个文件,它包含位置start,不包含下面这样的字符,您不必写这么多时间
One=substr($0,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"]=$1;pos[i,"e"]=$2+0?$2:length;next}{for(j=1; j<=i; j++) printf("%s%s", substr($0,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”]=$1;pos[i,“e”]=$2+0?$2:length;接下来的}{for(j=1;jawk也可能对您有同样的帮助

awk '
function check(val, re){
  split(val, array,",");
  re=array[1] && array[2]?substr($0,array[1],array[2]):substr($0,array[1]);
  return re
}
FNR==NR{
  match($0,/\(.*\)/);
  a[FNR]=substr($0,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

您的配置文件是否真的包含像
one=substr($0,1,1)
这样的语句?如果是的话-为什么不只是
1104…
?另一个很好的解决方案!(接近10K!)祝大家好运。@Sheller:非常感谢您,又有900多个go@AkshayHegde,你太棒了,我知道你很快就会完成的(10k).我的祝福与你同在。非常感谢。这是一个非常好的解决方案。更具活力。谢谢dude@zimzim:不客气,还有一件事你可能没有注意到,你在位置文件中给出的顺序,列会相应地移动,因此交换列对你来说很容易。我必须考虑这一点,但我相信你是对的!