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)
请注意,我还简化了字符串格式.
roo*_*ook 11
享受这一个:
awk '{printf t $1"-"$2} {t=", "}' $a >> positions
Run Code Online (Sandbox Code Playgroud)
是的,一见钟情看起来有点棘手.所以,我会解释,首先,让我们改变printf到print对净度:
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)继续迭代,我们将得到所需的序列.
我会通过在运行脚本之前查找行数来实现,例如使用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)