读取多个文件并更改字段

时间:2012-05-12 18:14:45

标签: python bash awk

我有两个这样的文件:

文件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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您还希望在awk中设置输出字段分隔符:

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

仅供参考,pastecut命令可以简化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 (对应于字段如果合适,输出整行,最后从file1中删除字段。

答案 2 :(得分:0)

我做过bash&amp; 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,但我会通过发布它来证明浪费时间。

答案 3 :(得分: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