使用awk处理具有不同字段分隔符的2个文件

时间:2014-07-01 17:30:44

标签: awk

我们说我有2个文件:

$ cat file1
A:10
B:5
C:12

$ cat file2
100 A
50 B
42 C

我希望有类似的内容:

A 10 100
B 5 50
C 12 42

我试过了:

awk 'BEGIN{FS=":"}NR==FNR{a[$1]=$2;next}{FS=" ";print $2,a[$2],$1}' file1 file2

哪个输出了我:

  100 A
B 5 50
C 12 42

我想这个问题来自于Field Separator,它对第二个文件设置得太迟了。如何为不同的文件(而不是单个文件)设置不同的字段分隔符?

谢谢


编辑:更一般的案例

使用file2和file3,如下所示:

$ cat file3
A:10 foo
B:5 bar 
C:12 baz

如何获得:

A 10 foo 100
B 5 bar 50
C 12 baz 42

3 个答案:

答案 0 :(得分:16)

只需在文件之间设置FS:

awk '...' FS=":" file1 FS=" " file2

即:

$ awk 'NR==FNR{a[$1]=$2;next}{print $2,a[$2],$1}' FS=":" file1 FS=" " file2
A 10 100
B 5 50
C 12 42

答案 1 :(得分:1)

您可以尝试以下内容:

$ cat f1
A:10
B:5
C:12

$  cat f2
100 A
50 B
42 C

$ awk 'NR==FNR{split($0,tmp,/:/);a[tmp[1]]=tmp[2];next}$2 in a{print $2,a[$2],$1}' f1 f2
A 10 100
B 5 50
C 12 42

或设置多个字段分隔符

$ awk -F"[: ]" 'NR==FNR{a[$1]=$2;next}$2 in a{print $2,a[$2],$1}' f1 f2
A 10 100
B 5 50
C 12 42

答案 2 :(得分:0)

更改FS后,您需要获取awk重新分割$0

您可以使用$0=$0(例如)。

所以你最后一个区块中的{FS=" ";$0=$0;...}会做你想做的事。

虽然只在第一次需要更改FS时才这样做,但对于大文件来说可能会稍微好一点。