Bash 使用awk匹配每列的行
如何使用awk为每列查找第2行中匹配的值 我想在一个标签有限的文件,并为每一列,如果任何行下面的第2行匹配什么是在第2行,打印字段与“匹配” 转换此制表符分隔的文件:Bash 使用awk匹配每列的行,bash,awk,Bash,Awk,如何使用awk为每列查找第2行中匹配的值 我想在一个标签有限的文件,并为每一列,如果任何行下面的第2行匹配什么是在第2行,打印字段与“匹配” 转换此制表符分隔的文件: header1 | header2 | header3 1 | 1 | B --------+---------+---------- 3 | 1 | A 2 | A | B 1 | B | 1 为此: header1 | header2 | header3 1 | 1 | B --------+---------+------
header1 | header2 | header3
1 | 1 | B
--------+---------+----------
3 | 1 | A
2 | A | B
1 | B | 1
为此:
header1 | header2 | header3
1 | 1 | B
--------+---------+----------
3 | 1场比赛| A
2 | A | B比赛
1场比赛| B | 1
学究式地使用GNU Awk 4.1.1:
awk -f so.awk so.txt
header1 header2 header3
1 1 B
3 1* A
2 A B*
1* B 1
使用so.awk
:
{
if(1 == NR) {
print $0;
} else if(2 == NR) {
for(i = 1; i <= NF; i++) {
answers[i]=$i;
}
print $0;
} else {
for(i = 1; i <= NF; i++) {
field = $i;
if(answers[i]==$i) {
field = field "*" # a match
}
printf("%s\t",field);
}
printf("%s", RS);
}
}
这不是家庭作业,对吧?学究式地说,使用GNU Awk 4.1.1:
awk -f so.awk so.txt
header1 header2 header3
1 1 B
3 1* A
2 A B*
1* B 1
使用so.awk
:
{
if(1 == NR) {
print $0;
} else if(2 == NR) {
for(i = 1; i <= NF; i++) {
answers[i]=$i;
}
print $0;
} else {
for(i = 1; i <= NF; i++) {
field = $i;
if(answers[i]==$i) {
field = field "*" # a match
}
printf("%s\t",field);
}
printf("%s", RS);
}
}
这不是家庭作业,对吧?学究式地说,使用GNU Awk 4.1.1:
awk -f so.awk so.txt
header1 header2 header3
1 1 B
3 1* A
2 A B*
1* B 1
使用so.awk
:
{
if(1 == NR) {
print $0;
} else if(2 == NR) {
for(i = 1; i <= NF; i++) {
answers[i]=$i;
}
print $0;
} else {
for(i = 1; i <= NF; i++) {
field = $i;
if(answers[i]==$i) {
field = field "*" # a match
}
printf("%s\t",field);
}
printf("%s", RS);
}
}
这不是家庭作业,对吧?学究式地说,使用GNU Awk 4.1.1:
awk -f so.awk so.txt
header1 header2 header3
1 1 B
3 1* A
2 A B*
1* B 1
使用so.awk
:
{
if(1 == NR) {
print $0;
} else if(2 == NR) {
for(i = 1; i <= NF; i++) {
answers[i]=$i;
}
print $0;
} else {
for(i = 1; i <= NF; i++) {
field = $i;
if(answers[i]==$i) {
field = field "*" # a match
}
printf("%s\t",field);
}
printf("%s", RS);
}
}
这不是家庭作业,对吧…?我会选择这样的方式:
$ cat file
header1 header2 header3
1 1 B
3 1 A
2 A B
1 B 1
$ awk -v OFS='\t' 'NR == 2 { for (i=1; i<=NF; ++i) a[i] = $i }
NR > 2 { for(i=1;i<=NF;++i) if ($i == a[i]) $i = $i " match" }1' file
header1 header2 header3
1 1 B
3 1 match A
2 A B match
1 match B 1
$cat文件
校长1校长2校长3
11b
31A
2 A B
1 B 1
$awk-vofs='\t''NR==2{for(i=1;i=2{for(i=1;i我喜欢这样的东西:
$ cat file
header1 header2 header3
1 1 B
3 1 A
2 A B
1 B 1
$ awk -v OFS='\t' 'NR == 2 { for (i=1; i<=NF; ++i) a[i] = $i }
NR > 2 { for(i=1;i<=NF;++i) if ($i == a[i]) $i = $i " match" }1' file
header1 header2 header3
1 1 B
3 1 match A
2 A B match
1 match B 1
$cat文件
校长1校长2校长3
11b
31A
2 A B
1 B 1
$awk-vofs='\t''NR==2{for(i=1;i=2{for(i=1;i我喜欢这样的东西:
$ cat file
header1 header2 header3
1 1 B
3 1 A
2 A B
1 B 1
$ awk -v OFS='\t' 'NR == 2 { for (i=1; i<=NF; ++i) a[i] = $i }
NR > 2 { for(i=1;i<=NF;++i) if ($i == a[i]) $i = $i " match" }1' file
header1 header2 header3
1 1 B
3 1 match A
2 A B match
1 match B 1
$cat文件
校长1校长2校长3
11b
31A
2 A B
1 B 1
$awk-vofs='\t''NR==2{for(i=1;i=2{for(i=1;i我喜欢这样的东西:
$ cat file
header1 header2 header3
1 1 B
3 1 A
2 A B
1 B 1
$ awk -v OFS='\t' 'NR == 2 { for (i=1; i<=NF; ++i) a[i] = $i }
NR > 2 { for(i=1;i<=NF;++i) if ($i == a[i]) $i = $i " match" }1' file
header1 header2 header3
1 1 B
3 1 match A
2 A B match
1 match B 1
$cat文件
校长1校长2校长3
11b
31A
2 A B
1 B 1
$awk-vofs='\t''NR==2{for(i=1;i2{for(i=1;我想你的数据实际上是这样的,有-+-
,或者每个字段之间只有制表符吗?@anubhava,因为它不是1
。第1列中需要的匹配是1
。第2列中需要的匹配也是1
,第3列中需要的匹配是B
。每列需要独立获取。数据仅以制表符分隔。我试图通过添加-->-+-
来澄清这一点,但事实并非如此。感谢您的评论。您的数据在-->-+-
中实际是这样的,还是每个字段之间只有制表符?@anubhava,因为我猜它不是1
。匹配项是第1列中需要的是1
。第2列中需要的匹配再次是1
,第3列中需要的匹配是B
。每一列都需要独立进行。数据只是以制表符分隔的。我试图通过添加-->-
来澄清这一点,但事实并非如此。谢谢您的评论。您的数据看起来真实吗像这样,对于-->
,或者每个字段之间只有制表符吗?@anubhava,因为它不是1
,我猜。第1列中需要的匹配是1
。第2列中需要的匹配也是1
,第3列中需要的匹配是B
。每个列都需要独立进行。第e数据只是以制表符分隔的。我试图通过添加-->-+-
来澄清这一点,但事实并非如此。谢谢您的评论。您的数据是否与-->-+-
一样,还是每个字段之间只有制表符?@anubhava,因为我想它不是1
。第1列中需要的匹配是1
。第2列中需要的匹配再次是1
,而第3列中需要的匹配是B
。每列都需要独立进行。数据仅以制表符分隔。我试图通过添加-->+--
来澄清这一点,但事实并非如此。感谢您的评论。很酷--不客气。如果您对这个answ感到满意的话呃,别忘了向上投票,然后单击复选标记选择它。-)酷——不客气。如果你对这个答案感到满意,别忘了向上投票,然后单击复选标记选择它。-)酷——不客气。如果您对这个答案感到满意,请不要忘记向上投票并单击复选标记选择它。-)酷——不客气。如果您对这个答案感到满意,请不要忘记向上投票并单击复选标记选择它。-)