指定要在每个记录行中打印的参数范围

指定要在每个记录行中打印的参数范围

我们有一个样本数据如下

EMP_ID|EMP_NAME|AGE|SALARAy|DepId|DepName
123456|XXXXXXXXX|30|10000000|1234|XYZWE

我使用下面的代码来分割数据,如下所示

awk -F\| '
BEGIN { print "EMP_ID|Values|HeaderName" }
NR==1 { for(i=3;i<=NF;i++) h[i]=$i }
NR>1 { for(i=3;i<=NF;i++) print $1"|"$2"|"$i"|"h[i] }
' records.txt 

和输出IS

EMP_ID|EMP_NAME|Values|HeaderName
12345|XXXXXXXXX|30|AGE
12345|XXXXXXXXX|10000000|SALARY
12345|XXXXXXXXX|1234|DepID
12345|XXXXXXXXX|XYZWE|DepName

在命令中,我指定了 """ print $1"|"$2"|"$i"|"h[i] """ ,从第一列和第二列开始附加 $i 和 h[i]。我没有指定 $1,$2,而是有更多的列,导致提及为 $1"|"$2"|"$3"|"$4 ....

我可以提及任何范围,而不是按顺序保留所有列名称。我尝试过以下命令但没有成功。

for i in ${@:1:4}

我可以指定任何范围,例如 1:4,而不是保留 $1"|"$2"|"$3"|"$4...

答案1

$ awk -F'|' '
    BEGIN {
      getline; split($0,a); OFS=FS; 
      print "EMP_ID", "EMP_NAME", "Values", "HeaderName"
    } 
    {
      for (i=3;i<=NF;i++) print $1, $2, $i, a[i];
    }
' sample
EMP_ID|EMP_NAME|Values|HeaderName
123456|XXXXXXXXX|30|AGE
123456|XXXXXXXXX|10000000|SALARAy
123456|XXXXXXXXX|1234|DepId
123456|XXXXXXXXX|XYZWE|DepName

如果要将输出字段的范围限制为与标头字段的数量相同,请将 更改split($0,a)n = split($0,a),然后将for循环终止条件更改为 ,i<=n而不是i<=NF。或者如果您想要的话,将其更改为固定数字。

答案2

您可以使用如下结构打印一系列列中的数据:

echo {0..9} | awk '{ for(i=3;i<8;i++) {printf $i"|"} }'

输出:

2|3|4|5|6|

相关内容