我们有一个样本数据如下
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|