Python 读取多个文件并更改字段

Python 读取多个文件并更改字段,python,bash,awk,Python,Bash,Awk,我有两个这样的文件: 文件1 1 2 3 1-24 1 2 5 文件2 1 0.33 3 2 0.14 4 3.2.1555 我需要逐行检查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

我有两个这样的文件:

文件1

1 2 3

1-24

1 2 5

文件2

1 0.33 3

2 0.14 4

3.2.1555

我需要逐行检查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
awk-F'\t'{BEGIN{FS=OFS=“\t”}如果($1==1&($2==2){getline
因此,输出文件应为:

1 0.33 3

2 0.148

3.2.1555

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

您还想在
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-

您只需从文件1的每一行中选取前两个字段,使用
粘贴
将它们添加到文件2中相应行的开头,然后修改字段5(对应于文件2中的字段3)如果合适,输入并输出整行,最后从文件1中删除字段。

您还需要在
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-

您只需从文件1的每一行中选取前两个字段,使用
粘贴
将它们添加到文件2中相应行的开头,然后修改字段5(对应于文件2中的字段3)如果合适,输出整行,最后从文件1中去掉字段。

您不需要使用
-F
,因为您正在
开始
块中设置
FS
OFS

你有一些大括号和圆括号不合适

$ 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
$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

您不需要使用
-F
,因为您正在
开始
块内设置
FS
OFS

你有一些大括号和圆括号不合适

$ 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
$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

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

(制表符分开)


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

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

(制表符分开)


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

自从你问起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

自从你问起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

cut、past和awk组合的解决方案非常出色!乍一看似乎很有效。无论如何,一旦我将输出文件用作python脚本的输入文件(其中我需要创建一个包含特定字段的数组和一个包含几乎其余字段的矩阵),它将返回“arr=N.array(data,dtype=dtype,copy=copy)ValueError:使用序列设置数组元素。“。可能,char和float存在一些问题。因此,我认为最好直接用python翻译此代码…有没有快速解决此问题的方法?提前谢谢大家!结合cut、pass和awk的解决方案非常出色!乍一看似乎很有效。无论如何,一旦我使用输出文件作为输入对于python脚本(我需要在其中创建一个包含特定字段的数组和一个包含几乎其余字段的矩阵),它返回“arr=N.array(data,dtype=dtype,copy=copy)ValueError:使用序列设置数组元素。”。可能,char和float有一些问题。因此,我认为最好直接用python翻译这段代码…这个问题有没有快速的解决方案?提前谢谢大家!用python解决方案怎么样?用python解决方案怎么样?只
如果(…)f[2]=8
非常感谢!只
如果(…)f[2]=8
非常感谢!