1

我有 2 个这样的文件:

文件 1

1 2 3 。. .

1 -2 4。. .

1 2 5 。. .

. . . . . .

. . . . .

文件 2

1 0.33 3 . . .

2 0.14 4 。. .

3 2.155 5 . . .

. . . . . .

. . . . . .

我需要逐行检查file1中的条件($1==1 && $2==-2)并修改file2中的相应行,$3=-2

我正在尝试:

awk -F '\t' '{ BEGIN { FS=OFS="\t" } if ($1==1 && ($2==-2) {getline < "file2" ; $3=8; print $0} else {getline < "file2" ; print $0}  }' file1

所以输出文件应该是:

1 0.33 3 . . .

2 0.14 8 。. .

3 2.155 5 . . .

. . . . . .

. . . . . .

但似乎修改了某些字符或空格。也许使用 Python 更容易解决这个问题?有什么建议吗?

4

4 回答 4

1

您不需要使用-F,因为您正在设置FSOFS在您的BEGIN块内。

你有一些花括号和括号不合适。

$ awk 'BEGIN { FS = OFS = "\t" } {if ($1 == 1 && $2 == -2) {getline < "file2"; $3 = 8} else {getline < "file2"}; print  }' file1
1   0.33    3
2   0.14    8
3   2.155   5
于 2012-05-12T19:26:55.957 回答
0

我用bash&做了sed,我不知道为什么(但bash问题上有标签,所以有点主题):

$ cat /tmp/1
1   2   3   .   .   .
1   -2  4   .   .   .
1   -2  5   .   .   .
.   .   .   .   .   .
.   .   .   .   .

(制表符分隔)

$ cat /tmp/2
1   0.33    3   .   .   .
2   0.14    4   .   .   .
3   2.155   5   .   .   .
.   .   .   .   .   .
.   .   .   .   .   .

$ lines=`grep -n "^1      -2      " /tmp/1 | sed 's/:.*//'`
$ for l in $lines; do sed -ri "${l}s/^(\S*)\t(\S*)\t\S*/\1\t\2\t8/" /tmp/2; done
$ cat /tmp/2
1   0.33    3   .   .   .
2   0.14    8   .   .   .
3   2.155   8   .   .   .
.   .   .   .   .   .
.   .   .   .   .   .

这可能是糟糕的脚本,我从来不擅长 bash,但我会通过发布它来证明浪费的时间。

于 2012-05-12T20:08:45.557 回答
0

您还想设置输出字段分隔符awk

awk -F '\t' -v OFS='\t' ' { if ... }' file1

仅供参考,pasteandcut命令可以简化awk脚本:

cut -f1,2 file1 | paste - file2 | \
awk -F '\t' -v OFS '\t' '$1==1 && $2==-2 {$5=8}; {print}' | \
cut -f3-

您只从 file1 的每一行中取出前两个字段,用于paste将它们添加到 file2 中相应行的开头,然后在适当的情况下修改字段5(对应于 file2 中的字段 3)并输出整行,最后剥离从file1中取出字段。

于 2012-05-12T18:50:06.943 回答
0

既然你问到 python

#!/usr/bin/env python

with open('f1') as  fd:
    f1 = [map(int,i.strip().split()) for i in fd]
with open('f2') as  fd:
    f2 = [map(float,i.strip().split()) for i in fd]

for n, f in enumerate(f2):
    if f1[n][0] == 1 and f1[n][1] == -2:
        print f[0], f[1], 8
    else:
        print f
于 2012-05-12T22:44:58.870 回答