【问题标题】:add a column from a specific line using awk使用 awk 从特定行添加一列
【发布时间】:2015-09-23 23:51:51
【问题描述】:

编辑:

我想在文件中添加一列,但只能从特定行开始。要添加的列存储在另一个文件中,该文件有几列,我只想添加第三列。与第二个文件相比,第一个文件有两个额外的行(第 1 行和第 2 行)。我还想在第二行(在这一行的末尾)添加一个额外的字符串

这是一个显示我想要的示例:

$ cat file1.txt
file1
index place value
1 A 0.1
2 A 0.3
3 B 0.1
4 B 0.6

$ cat file2.txt
A 1 0.3
A 1 0.4
B 1 0.4
B 1 0.6

这将是所需的输出

$ cat output.txt
file1
index place value score
1 A 0.1 0.3
2 A 0.3 0.4
3 B 0.1 0.4
4 B 0.6 0.6

提前致谢

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    你可以使用tailpasteecho

    awk 'NR==1; NR==2{print $0, "score"} NR>2{a[++i]=$0} NR>FNR{print a[FNR], $NF}' file1 file2
    file1
    index place value score
    1 A 0.1 0.3
    2 A 0.3 0.4
    3 B 0.1 0.4
    4 B 0.6 0.6
    

    PS:要获得格式化的表格输出,请使用column -t:

    awk 'NR==1;NR==2{print $0, "score"} NR>2{a[++i]=$0} NR>FNR{print a[FNR], $NF}' file1 file2|
         column -t
    file1
    index  place  value  score
    1      A      0.1    0.3
    2      A      0.3    0.4
    3      B      0.1    0.4
    4      B      0.6    0.6
    

    【讨论】:

    • 感谢@anubhava,如果我想在输出中保留第一行('file1')?
    • 似乎多了一行包含字符串“file1”。我想可以在答案中的第一个 echo 命令前面添加 head -n1 file1;。但是,如果关于“file1”行的假设为真,则需要使用tail -n+3
    • 可能我没有解释清楚,我的输出应该是 Ed Morton
    • 是的,它意识到了这一点并进行了修改以解决这个问题。我的印象是file1 只是为了名义上的目的。
    • 谢谢@anubhava,这是我的错,当最后一个问题时,如果我 file2.txt 有三列并且我只想添加第三列,那么命令将如何?我应该打开一个新问题还是编辑这个问题?
    【解决方案2】:
    $ paste -d' ' file1.txt <(sed '1s/^/\nscore\n/' file2.txt)
    file1
    index place value score
    1 A 0.1 0.3
    2 A 0.3 0.4
    3 B 0.1 0.4
    4 B 0.6 0.6
    

    【讨论】:

    • 也许问题在您回答后发生了变化,但它如何不粘贴 file2 的前两列?
    • 是的,问题变了,当我回答时 file2 只有 1 列。我把它留给@anubhava 来处理模糊和混乱的要求:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多