我有两个这样的文件:
文件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,解决这个问题更简单? 有什么建议吗?
答案 0 :(得分:1)
由于您在-F
区块内设置FS
和OFS
,因此无需使用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
仅供参考,paste
和cut
命令可以简化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