AWK:使用不同的OFS生成两个输出文件

时间:2017-12-21 14:33:39

标签: awk

免责声明:我知道可以使用tr和其他人轻松解决此问题,但我很想让它仅在awk中使用。

我想使用awk生成两个不同OFS的输出文件(相同内容)。这是我到目前为止所尝试的,我知道这是错误的:

awk '$14==1 {

{print $0 > "output.txt"}
{OFS=","}
{print $0 > "output.csv"}

}' inputfile.txt

(输入文件以制表符分隔)。当我运行这个时,我得到两个文件(由$14==1正确过滤),内容完全相同,仍然是原始的OFS。我知道我可以通过执行

明确告诉print语句使用“,”
{print $1","$2...}

{printf("%s,%s,,,\n",$1,$2...)}

但是输入文件有超过50列,我觉得有一个优雅的解决方案。

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果您只是print而不更改$x的值,则无论如何都不会应用OFS

你可以:

 awk -F',' '{print $0 > "file1"}{gsub(FS, " ");print $0 > "file2"}' input

或使用默认OFS

awk -F',' '{print $0 > "file1";$1=$1;print $0 > "file2"}' input

在上述代码中,$1=$1 更改 $1的值,即使具有相同的值,也会应用OFS

答案 1 :(得分:1)

对于2个不同的输出文件使用2个不同的OFS值,即使输入文件中没有使用FS,或者您有其他原因需要重建输出记录:

awk '$14==1 {
    $1=$1; print > "output.txt"     # use the original OFS value
    ofs=OFS; OFS=","
    $1=$1; print > "output.csv"     # use the alternate OFS value
    OFS=ofs
}' inputfile.txt

如上所述给定制表符分隔的输入会创建一个空格分隔的输出.txt文件和逗号分隔的输出.csv文件。如果您希望.txt文件以制表符分隔,则需要将OFS设置为选项卡(如果您的输入可以包含空白字符或空字段,那么您也希望将FS设置为选项卡。)

还要考虑这个:

awk -v ofs1='|' -v ofs2=',' '$14==1 {
    OFS=ofs1; $1=$1; print > "output.txt"     # use ofs1
    OFS=ofs2; $1=$1; print > "output.csv"     # use ofs2
}' inputfile.txt