我有两个文件文件1和文件2.我想看到file1的第一列并转到file2中的那个行号。之后我将file1的$ 2与file2的$ 6进行比较。如果匹配则打印"纠正ans"。我想使用awk执行此操作。
FILE1.TXT
1,B
3,C
2,A
FILE2.TXT
Html,WeB,title,tech,Laravel,B
Html,WeB,title,tech,Laravel,D
Html,WeB,title,tech,Laravel,C
Output.txt的
Question 1 is correct
Question 3 is correct
Question 2 is incorrect
我试过这样做。
awk -F[","] 'NR==FNR{n=$1;b=$2}
{if( NR==$1 && $6==b){printf "Question n is correct "}
else { printf "Question n is incorrect"}}' myfile rahulque
答案 0 :(得分:1)
$ awk -F, 'FNR==NR{ans[NR]=$6;next} {print "Question",$1,"is",((ans[$1]==$2)?"":"in")"correct";}' file2.txt file1.txt
Question 1 is correct
Question 3 is correct
Question 2 is incorrect
FNR==NR{ans[NR]=$6;next}
对于列出的第一个文件file2.txt
的每一行,我们将正确答案$6
存储在数组ans
中,其中包含行号NR
,钥匙。然后,我们告诉awk跳过其余命令并跳转到next
行。
print "Question",$1,"is",((ans[$1]==$2)?"":"in")"correct"
对于第二个列出的文件file1.txt
的每一行,我们打印问题$1
的答案是否与数组a
中指定的正确答案匹配。
更详细地说,让我们看一下三元语句:
(ans[$1]==$2)?"":"in"
如果ans[$1]==$2
,答案是正确的。在这种情况下,三元语句返回一个空字符串。如果答案不正确,则三元语句返回字符串in
。三元语句返回的字符串放在字符串correct
的前面,以形成所需的单词。
答案 1 :(得分:0)
我总是发现awk
令人困惑,所以如果我找到这个问题的解决方案,我会避免awk
所有人在一起,只写一个像...这样的shell脚本。
#!/bin/sh
sort file1.txt | cut -d, -f2 > /tmp/file1.cut
cut -d, -f6 file2.txt > /tmp/file2.cut
count=0
while read -r a && read -r b <&3
do
count=`expr $count + 1`
if [ $a == $b ]
then
echo "Question $count is correct"
else
echo "Question $count is incorrect"
fi
done < /tmp/file1.cut 3< /tmp/file2.cut
...这似乎适用于您提供的示例数据。
$ cat file1.txt
1,B
3,C
2,A
$ cat file2.txt
Html,WeB,title,tech,Laravel,B
Html,WeB,title,tech,Laravel,D
Html,WeB,title,tech,Laravel,C
$ ./correct.sh
Question 1 is correct
Question 2 is incorrect
Question 3 is correct
$ cat correct.sh
#!/bin/sh
sort file1.txt | cut -d, -f2 > /tmp/file1.cut
cut -d, -f6 file2.txt > /tmp/file2.cut
count=0
while read -r a && read -r b <&3
do
count=`expr $count + 1`
if [ $a == $b ]
then
echo "Question $count is correct"
else
echo "Question $count is incorrect"
fi
done < /tmp/file1.cut 3< /tmp/file2.cut
我确定有更好的方法可以做到这一点,比如使用awk,但我认为shell脚本方法更灵活。例如,如果您想计算错误和正确答案的数量。