如何使用 sed 或 awk 在每行的末尾附加文本(就地)?

How to append text at the end of each line (in-place) using sed or awk?

现有 table(sam.txt):

 36419 36418
 36418 36417
 36417 36416
 36416 36415

期望的输出:

 36419 36418 1
 36418 36417 2
 36417 36416 3
 36416 36415 3

我想附加 1,2,3,4 作为额外的列。我在 sed 命令下尝试过,但我无法循环行号 $NUMBER as gives syntax error?

linecount=$(wc -l < sam.txt)
for (( NUMBER=1; NUMBER<=linecount; NUMBER++ ))
do  
   sed -i "$NUMBERs/.*/& $b/" sam.txt
done

更新: 删除了单元格之间的竖线,因为它会造成混淆。我保留了垂直条以呈现为 HTML table 但它没有按预期加载。

在 awk $0 中给出整行,您可以添加文本 needed.We 声明一个变量 a,我们在使用它之前递增它,这意味着它在第一行。然后我们打印整行 + aspace 变量 a

  • 我们运行:
~/tests $ cat sam.txt | awk '{ ++a; print [=10=] " " a  }'   

输出

36419 36418 1
36418 36417 2                                
36417 36416 3
36416 36415 4

这是对原问题的回复。

而不是 运行多次 sed,生成一个 sed 脚本并且 运行 只生成一次。

#! /bin/bash
lines=$(wc -l < "")
{
    echo '1s/$/C/'
    echo '2s/$/----/'
    for ((n=3; n<=lines; ++n)) ; do
        echo $n's/$/'$((n-2))/
    done
    echo 's/$/|/'
} | sed -f- ""
$ awk '{print [=10=], NR}' sam.txt
36419 36418 1
36418 36417 2
36417 36416 3
36416 36415 4

如果你想修改原始文件然后用 GNU awk:

awk -i inplace '{print [=11=], NR}' sam.txt

或使用任何 awk:

awk '{print [=12=], NR}' sam.txt > tmp && mv tmp sam.txt

最后一个脚本是 gawk、sed、perl、ruby 等在幕后所做的,none 其中确实进行“就地”编辑,它们都在内部使用临时文件文件。