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=“,”
行没有更改任何内容。