Unix 在awk中使用if-else语句时的OFS

Unix 在awk中使用if-else语句时的OFS,unix,awk,Unix,Awk,我有一个简单的文本文件,由多个空格分隔,列数不同(6或5) 我要做的是,对于超过5列的行,将最后2列合并为一列,执行以下操作: cat data.txt | awk'{如果(NF>5)打印$1、$2、$3、$4、$5“”$6;否则打印$0}OFS=“,””>data.csv 问题是OFS的不适用于else语句 示例-输入: a d e t er ap b q j n mm 我得到的输出: a,d,e,t,er_ap b q j n mm 理想产出: a,d,e,

我有一个简单的文本文件,由多个空格分隔,列数不同(6或5)

我要做的是,对于超过5列的行,将最后2列合并为一列,执行以下操作:

cat data.txt | awk'{如果(NF>5)打印$1、$2、$3、$4、$5“”$6;否则打印$0}OFS=“,””>data.csv

问题是OFS的
不适用于else语句

示例-输入:

a   d   e  t er ap
b   q   j  n mm
我得到的输出:

a,d,e,t,er_ap
b   q   j  n mm
理想产出:

a,d,e,t,er_ap
b,q,j,n,mm

有什么建议吗

BEGIN
块中设置OFS,以便在进行任何处理之前它是一个逗号。另外,当您在不以任何方式操作行的情况下打印$0时,awk将使用源文件中的任何分隔符按原样吐出行。我个人认为这很愚蠢,但这很糟糕。作为一种解决方法,只需将一列设置为自身相等,然后打印:

awk 'BEGIN{OFS=","}{if(NF>5) print $1,$2,$3,$4,$5"_"$6; else {$1=$1;print $0}}' data.txt
如果您预期超过6列,您可以让它在第5列之后为所有列添加下划线,并使用一些
printf
技巧

awk '{for (i=1;i<=NF;i++){printf (i==NF)?"%s\n":(i>=5)?"%s_":"%s,", $i}}' data.txt
awk'{for(i=1;i=5)“%s”:“%s,,$i}}”data.txt

将OFS设置为无操作状态是否有合理的理由?非常感谢。效果很好。我总是很难记住这个
$1=$1
。无论如何,再次谢谢你!