我有两个文件。 (这两个真实文件的长度为50-100行。)
文件1包含4个字段的记录。 名称;原始阅读分数;原始数学分数;原始科学分数
文件2具有由4个字段组成的记录(查找表) 原始比分;转换阅读;转换数学;转换科学 对于任何给定的原始分数转换,此文件可能包含重复条目 例如,原始得分8和9都等于科学的转换得分为50。
我想创建一个包含7个字段的输出文件: 名称;原始阅读分数;转换阅读;原始数学分数;转换数学;原始科学分数;转换科学
所以对于史密斯在我下面的例子中,得分的结果 3,7,4应该是: 3-5,7-5,4-15(我为可读性添加了间隔,破折号和逗号)
示例文件1(名称和3个原始分数)
Smith;3;7;4
Jones;8;2;9
Doe;1;9;4
示例文件2(原始和3个转换分数)
1;1;1;1
2;3;2;5
3;5;2;10
4;6;3;15
5;8;4;22
6;11;5;35
7;15;5;43
8;18;6;50
9;20;7;50
所需的输出文件(名称,然后交替3个原始分数和3个转换分数)
Smith;3;5;7;5;4;15
Jones;8;18;2;2;9;50
Doe;1;1;9;7;4;15
所以我想我想把文件2读入数组,然后在文件1中读取,使用数组查找转换后的分数,然后输出名称和3组原始和转换分数。
这是AWK的可行任务,还是我应该在其他地方看看?
谢谢,
吉姆
答案 0 :(得分:2)
这应该有效:
awk -F';' -v OFS=";" 'NR==FNR{a[$1]=$0;next}
{
split(a[$2],b)
split(a[$3],c)
split(a[$4],d)
print $1,$2,b[2],$3,c[3],$4,d[4]}' file2 file1
答案 1 :(得分:1)
我相信应该这样做:
awk 'BEGIN{OFS=FS=";"}NR==FNR{s[$1,1]=$2;s[$1,2]=$3;s[$1,3]=$4;next}{print $1,$2,s[$2,1],$3,s[$3,2],$4,s[$4,3]}' table people
注意文件的反转。
解释:
# Before processing any lines
BEGIN{
# Set the input and output field separators
OFS=FS=";"
}
# For the first file
NR==FNR {
# Record the mappings - $1 is the first field, $2 the second, etc.
s[$1,1]=$2;
s[$1,2]=$3;
s[$1,3]=$4;
# Skip to the next line. This is often used
# instead of putting the opposite condition
# on the rest of the blocks, or putting a big
# if/else in one block.
next
}
# Every line that reaches here, i.e. the second file
{
# Print the student's name followed by each score raw and mapped.
print $1, $2, s[$2,1], $3, s[$3,2], $4, s[$4,3]
}
答案 2 :(得分:1)
这应该有效:
awk '
BEGIN{FS=OFS=";"}
NR==FNR{cr[$1]=$2;cm[$1]=$3;cs[$1]=$4;next}
{print $1,$2,cr[$2],$3,cm[$3],$4,cs[$4]}
' file2 file1
<强>输出强>
Smith;3;5;7;5;4;15
Jones;8;18;2;2;9;50
Doe;1;1;9;7;4;15