打印一个逗号,除了在awk中的最后一行(Print a comma except on the la

2019-07-18 16:37发布

我有以下脚本

awk '{printf "%s", $1"-"$2", "}' $a >> positions;

其中, $a存储文件的名称。 其实我写多个列值成一排。 不过,我想打印一个逗号只如果我没有在最后一行。

Answer 1:

我会通过运行脚本,例如用的coreutils和bash之前查找的行数做到这一点:

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

如果你的文件只有两列,下面的coreutils替代也适用。 实施例的数据:

paste <(seq 5) <(seq 5 -1 1) | tee testfile

输出:

1   5
2   4
3   3
4   2
5   1

现在用换行更换标签, paste容易组装的时间为所需的格式:

 <testfile tr '\t' '\n' | paste -sd-,

输出:

1-5,2-4,3-3,4-2,5-1


Answer 2:

单回合方法:

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

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



Answer 3:

喜欢这一个:

awk '{printf t $1"-"$2} {t=", "}' $a >> positions

叶,看上去第一眼有点棘手。 所以,我会解释,首先让我们改变的printfprint的清晰度:

awk '{print t $1"-"$2} {t=", "}' file

并看看它做什么,例如,对于这个简单的内容文件:

1 A
2 B
3 C
4 D

因此会产生如下:

 1-A
 , 2-B
 , 3-C
 , 4-D

诀窍是前述t变量这是在开始时是空的。 该变量将被设置{t=...}仅在处理的下一步骤它被示出后{print t ...} 因此,如果我们( awk )继续迭代我们会得到想要的序列。



Answer 4:

你可能会认为awk的ORS和OFS是处理这种合理的方式:

$ awk '{print $1,$2}' OFS="-" ORS=", " input.txt

但是,这导致最终ORS因为输入包含在最后一行换行。 换行是一个记录分隔符,所以从awk的角度来看,在输入一个空的最后一个记录。 您可以解决这个带着几分两轮牛车的,但是得到的复杂性消除了一个班轮的风采。

因此,这里是我拿到这个。 既然你说你是“写多个列的值”,它可能是用口服补液盐和OFS出碴会造成问题。 因此,我们可以用格式完全达到所需的输出。

$ cat input.txt
3 2
5 4
1 8
$ awk '{printf "%s%d-%d",t,$1,$2; t=", "} END{print ""}' input.txt
3-2, 5-4, 1-8

这类似于迈克尔和车的单程的方法,但是它使用一个单一printf和正确地使用格式化的格式字符串。

这可能会执行比可以忽略不计迈克尔的解决方案更好,因为转让应该不会超过一测试CPU少,而且明显比任何的多通道解决方案的更好,因为该文件只需要读取一次。



Answer 5:

这里有一个更好的办法,而不是诉诸的coreutils:

awk 'FNR==NR { c++; next } { ORS = (FNR==c ? "\n" : ", "); print $1, $2 }' OFS="-" file file


Answer 6:

awk '{a[NR]=$1"-"$2;next}END{for(i=1;i<NR;i++){print a[i]", " }}' $a > positions


文章来源: Print a comma except on the last line in Awk