如果我们有第一个文件如下:
(a.txt)
1 asm
2 assert
3 bio
4 Bootasm
5 bootmain
6 buf
7 cat
8 console
9 defs
10 echo
和第二个像:
(b.txt)
bio cat BIO bootasm
bio defs cat
Bio console
bio BiO
bIo assert
bootasm asm
bootasm echo
bootasm console
bootmain buf
bootmain bio
bootmain bootmain
bootmain defs
cat cat
cat assert
cat assert
我们希望输出如下:
3 7 3 4
3 9 7
3 8
3 3
3 2
4 1
4 10
4 8
5 6
5 3
5 5
5 9
7 7
7 2
7 2
我们读取第一个文件中每个文件中的每个第二列,我们搜索它是否存在于第二个文件中每行的每一列中,如果是,我们将其替换为第一个文件中第一列中的数字。我只是在第一栏中做到了,其余时间我都做不了。
这是我使用的命令 awk' NR == FNR {a [$ 2] = $ 1; next} {$ 1 = a [$ 1];} 1' a.txt b.txt
3 cat bio bootasm
3 defs cat
3 console
3 bio
3 assert
4 asm
4 echo
4 console
5 buf
5 bio
5 bootmain
5 defs
7 cat
7 assert
7 assert
我该怎么做其他专栏?
三江源
答案 0 :(得分:8)
awk 'NR==FNR{h[$2]=$1;next} {for (i=1; i<=NF;i++) $i=h[$i];}1' a.txt b.txt
NR
是所有文件的全局记录号(默认行号)。 FNR
是当前文件的行号。 NR==FNR
块指定当全局行号等于当前数时要采取的操作,仅对第一个文件(即a.txt)为真。此块中的next
语句会跳过其余代码,因此for循环仅可用于第二个文件e.i.,b.txt。
首先,我们处理第一个文件,以便将单词id存储在关联数组中:NR==FNR{h[$2]=$1;next}
。之后,我们可以使用这些ID来映射第二个文件中的单词。 for循环(for (i=1; i<=NF;i++) $i=h[$i];
)遍历所有列,并将每列设置为数字而不是字符串,因此$i=h[$i]
实际上用其id替换第i列的单词。最后,脚本末尾的1
会打印出所有行。
产地:
3 7 3 4
3 9 7
3 8
3 3
3 2
4 1
4 10
4 8
5 6
5 3
5 5
5 9
7 7
7 2
7 2
要使脚本不区分大小写,请将tolower
次调用添加到数组索引中:
awk 'NR==FNR{h[tolower($2)]=$1;next} {for (i=1; i<=NF;i++) $i=h[tolower($i)];}1' a.txt b.txt
答案 1 :(得分:3)
分而治之!,有点陈旧,但做的工作=)
awk 'NR==FNR{a[$2]=$0;next}{$1=a[$1];}1' a.txt b.txt | tr ' ' ',' | awk '{ print $1 }' FS="," > 1
awk 'NR==FNR{a[$2]=$0;next}{$1=a[$2];}1' a.txt b.txt | tr ' ' ',' | awk '{ print $1 }' FS="," > 2
awk 'NR==FNR{a[$2]=$0;next}{$1=a[$3];}1' a.txt b.txt | tr ' ' ',' | awk '{ print $1 }' FS="," > 3
awk 'NR==FNR{a[$2]=$0;next}{$1=a[$4];}1' a.txt b.txt | tr ' ' ',' | awk '{ print $1 }' FS="," > 4
paste 1 2 3 4 | tr '\t' ' '
给出:
3 7 3 4
3 9 7
3 8
3 3
3 2
4 1
4 10
4 8
5 6
5 3
5 5
5 9
7 7
7 2
7 2
在这种情况下,我只是更改了列数并将结果与中间的一些版本粘贴在一起。
答案 2 :(得分:3)
{
cat a.txt; echo "--EndA--";cat b.txt
} | sed -n '1 h
1 !H
$ {
x
: loop
s/^ *\([[:digit:]]\{1,\}\) *\([^[:cntrl:]]*\)\(\n\)\(.*\)\2/\1 \2\3\4\1/
t loop
s/^ *[[:digit:]]\{1,\} *[^[:cntrl:]]*\n//
t loop
s/^[[:space:]]*--EndA--\n//
p
}
'
“ - EndA--”如果有机会出现在其中一个文件中(主要是a.txt)可能是其他东西