在Awk的最后一行打印逗号

Per*_*ika 12 shell awk separator

我有以下脚本

awk '{printf "%s", $1"-"$2", "}' $a >> positions;
Run Code Online (Sandbox Code Playgroud)

其中$a存储文件的名称.我实际上是将多个列值写入一行.但是,我想在我不在最后一行时打印一个逗号.

Mic*_*ber 19

单程方法:

cat "$a" | # look, I can use this in a pipeline! 
  awk 'NR > 1 { printf(", ") } { printf("%s-%s", $1, $2) }'
Run Code Online (Sandbox Code Playgroud)

请注意,我还简化了字符串格式.

  • @KrzysztofJabłoński我意识到这里对使用`cat`的狂热仇恨是理所当然的,但是您的选择完全忽略了这一点。其他答案取决于不允许在管道中使用的多遍方法,我在这里证明是可行的。 (2认同)

roo*_*ook 11

享受这一个:

awk '{printf t $1"-"$2} {t=", "}' $a >> positions
Run Code Online (Sandbox Code Playgroud)

是的,一见钟情看起来有点棘手.所以,我会解释,首先,让我们改变printfprint对净度:

awk '{print t $1"-"$2} {t=", "}' file
Run Code Online (Sandbox Code Playgroud)

并查看它的作用,例如,对于具有以下简单内容的文件:

1 A
2 B
3 C
4 D
Run Code Online (Sandbox Code Playgroud)

所以它会产生以下结果:

 1-A
 , 2-B
 , 3-C
 , 4-D
Run Code Online (Sandbox Code Playgroud)

诀窍是前面的t变量,它在开头是空的.该变量{t=...}仅在显示后的下一步处理中设置{print t ...}.因此,如果我们(awk)继续迭代,我们将得到所需的序列.


Tho*_*hor 5

我会通过在运行脚本之前查找行数来实现,例如使用coreutils和bash:

awk -v nlines=$(wc -l < $a) '{printf "%s", $1"-"$2} NR != nlines { printf ", " }' $a >>positions
Run Code Online (Sandbox Code Playgroud)

如果您的文件只有2列,则以下coreutils替代方案也可以使用.示例数据:

paste <(seq 5) <(seq 5 -1 1) | tee testfile
Run Code Online (Sandbox Code Playgroud)

输出:

1   5
2   4
3   3
4   2
5   1
Run Code Online (Sandbox Code Playgroud)

现在用换行符替换选项卡,paste可以轻松地将日期组合成所需的格式:

 <testfile tr '\t' '\n' | paste -sd-,
Run Code Online (Sandbox Code Playgroud)

输出:

1-5,2-4,3-3,4-2,5-1
Run Code Online (Sandbox Code Playgroud)