免责声明:我知道可以使用tr
和其他人轻松解决此问题,但我很想让它仅在awk
中使用。
我想使用awk
生成两个不同OFS的输出文件(相同内容)。这是我到目前为止所尝试的,我知道这是错误的:
awk '$14==1 {
{print $0 > "output.txt"}
{OFS=","}
{print $0 > "output.csv"}
}' inputfile.txt
(输入文件以制表符分隔)。当我运行这个时,我得到两个文件(由$14==1
正确过滤),内容完全相同,仍然是原始的OFS。我知道我可以通过执行
{print $1","$2...}
或
{printf("%s,%s,,,\n",$1,$2...)}
但是输入文件有超过50列,我觉得有一个优雅的解决方案。
提前致谢!
答案 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