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

AWK:使用不同的OF生成两个输出文件,awk,Awk,免责声明:我知道使用tr和其他工具可以轻松解决此问题,但我很想让它只在awk中工作 我想使用awk生成两个具有不同OF的输出文件(相同内容)。以下是我到目前为止所做的尝试,顺便说一句,我知道这是错误的: awk '$14==1 { {print $0 > "output.txt"} {OFS=","} {print $0 > "output.csv"} }' inputfile.txt (输入文件以制表符分隔)。当我运行这个程序时,我得到两个文件(通过$14==1正确过滤),内

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

我想使用
awk
生成两个具有不同OF的输出文件(相同内容)。以下是我到目前为止所做的尝试,顺便说一句,我知道这是错误的:

awk '$14==1 {

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

}' inputfile.txt
(输入文件以制表符分隔)。当我运行这个程序时,我得到两个文件(通过
$14==1
正确过滤),内容完全相同,仍然是原始OFS。我知道我可以通过这样做明确地告诉print语句使用“,”

{print $1","$2...}

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


提前谢谢

如果只打印
而不更改
$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
如果您只
打印
而不更改
$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
为两个不同的输出文件使用两个不同的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
给定与上面类似的制表符分隔的输入,将创建一个空白分隔的output.txt文件和一个逗号分隔的output.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

要对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
给定与上面类似的制表符分隔的输入,将创建一个空白分隔的output.txt文件和一个逗号分隔的output.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

我的意思是两个输出文件完全相同(
diff output.txt output.csv
不返回任何内容),因此我的
OFS=“,”
行没有更改任何内容。我的意思是两个输出文件完全相同(
diff output.txt output.csv
不返回任何内容),因此我的
OFS=“,”
行没有更改任何内容。