【问题标题】:Replacing a specific column of a file with the column of another file using sed in linux在linux中使用sed将文件的特定列替换为另一个文件的列
【发布时间】:2012-03-27 13:00:04
【问题描述】:

我有两个文件。

file1 的数据如下所示,仅包含一列。

112.319
108.915
105.512

file2 的数据如下所示,包含八列。

0.000000     0.000     0.000     0.000     0.000         0     0.0001.0000E+20  
0.000000     0.000     0.000     0.000 20.000000         0     0.0001.0000E+20  
0.000000     0.000     0.000     0.000 20.000000         0     0.0001.0000E+20 

我想用 file1 的第一列替换 file2 的第一列,输出将是

112.319     0.000     0.000     0.000     0.000         0     0.0001.0000E+20  
108.915     0.000     0.000     0.000 20.000000         0     0.0001.0000E+20  
105.512     0.000     0.000     0.000 20.000000         0     0.0001.0000E+20

我尝试将每一行的第一条记录替换为另一行的第一条记录,但没有成功。如果有人可以帮助我使用 sed,我将不胜感激。

最好的问候。

【问题讨论】:

    标签: linux replace sed


    【解决方案1】:

    您可以使用paste/tr/cut/column 命令:

    $ paste file{1,2} | tr -s ' ' | cut -d ' ' -f 1,3- | column -t
    112.319  0.000000  0.000  0.000  0.000      0  0.0001.0000E+20
    108.915  0.000000  0.000  0.000  20.000000  0  0.0001.0000E+20
    105.512  0.000000  0.000  0.000  20.000000  0  0.0001.0000E+20
    

    【讨论】:

    • 它根本不工作。 file1 有一个名称 Reibung.txt 和 file2 有一个名称摩擦.txt 所以我写粘贴 Reibung.txt 摩擦.txt | tr -s ' ' |剪切-d''-f 1,3- | column -t >friction1 # 但什么也没发生。
    【解决方案2】:
    join -o 1.2,2.3,2.4,2.5,2.6,2.7,2.8 <(cat -n file1) <(cat -n file2) | column -t
    

    生产

    112.319  0.000  0.000  0.000  0.000      0  0.0001.0000E+20
    108.915  0.000  0.000  0.000  20.000000  0  0.0001.0000E+20
    105.512  0.000  0.000  0.000  20.000000  0  0.0001.0000E+20
    

    更新:由于空格很重要,您可以使用字符串替换。这是awk:

    awk 'NR==FNR {n[FNR]=$1; next} {sub(/[^[:space:]]+/, n[FNR]); print}' f1 f2
    

    生产

    112.319     0.000     0.000     0.000     0.000         0     0.0001.0000E+20
    108.915     0.000     0.000     0.000 20.000000         0     0.0001.0000E+20
    105.512     0.000     0.000     0.000 20.000000         0     0.0001.0000E+20
    

    【讨论】:

    • 它可以工作,但会改变格式,比如数字之间的间距非常重要,否则软件无法识别数字。
    【解决方案3】:

    这可能对你有用:

     cut -d' ' -f2- file2 | paste -d' ' file1 -
    

    或者这个(GNU sed):

    sed 'R file2' file1 | sed 'N;s/\n\S*//'
    

    或者这个:

     awk 'FNR==NR{a[NR]=$1;next};{sub($1,a[FNR])}1' file1 file2
    

    编辑:

    这可能对你有用:(GNU sed?)

    sed '=;s/.*/s|\\S*|&|/' file1 | sed 'N;s/\n//' | sed -i -f - file2
    

    【讨论】:

    • 您的解决方案接近我正在寻找的解决方案。使用 sed 可以正常工作,但问题是它将列添加到文件 2 但不在那里替换。我的意思是它复制但不替换。我期待着 sed 的解决方案,问候
    • 我认为您的意思是您想使用-i 就地编辑功能。见编辑。
    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2023-03-07
    • 1970-01-01
    • 2018-12-27
    相关资源
    最近更新 更多