OSX bash脚本 - 在/ dev / stdin上发生awk i / o错误 - 将固定宽度转换为制表符分隔并将空格分隔转换为制表符分隔

时间:2014-06-24 18:19:38

标签: macos bash file-io awk

我有一个bash脚本,可以在Linux和OSX中运行。这个脚本在Linux中运行良好,但是当我在OSX上尝试它时,它失败了:awk: i/o error occurred on /dev/stdin。我正在使用awk输入固定宽度或空格分隔的文件,并输出(临时)制表符分隔文件以供播放,然后在我完成时删除该文件。< / p>

#!/bin/bash

.... # lots of commands

# for space-delimited to tab-delimited
awk < input_spaces.txt 'BEGIN{ FS=" "; OFS="\t";}{print $1,$2,$3,$4,$5,$6,$7,$8}' > temp_file.txt

.... # some stuff using temp_file.txt

rm temp_file.txt

# for fixed-width to tab-delimited    
awk < input_tabs.txt 'BEGIN{ FIELDWIDTHS = "32 3 10 9 8 8 9"; OFS="\t";}{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14}' > temp_file.txt

.... # some stuff using temp_file.txt

rm temp_file.txt

.... # lots of other commands

错误讯息:

awk: i/o error occurred on /dev/stdin

所有出现的awk的讨论用途。

可替换地:

#!/bin/bash

.... # lots of commands

# for space-delimited to tab-delimited
awk 'BEGIN{ FS=" "; OFS="\t";}{print $1,$2,$3,$4,$5,$6,$7,$8}' input_spaces.txt > temp_file.txt

cat temp_file.txt

.... # some stuff using temp_file.txt

rm temp_file.txt

# for fixed-width to tab-delimited    
awk 'BEGIN{ FIELDWIDTHS = "32 3 10 9 8 8 9"; OFS="\t";}{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14}' input_tabs.txt > temp_file.txt

cat temp_file.txt

.... # some stuff using temp_file.txt

rm temp_file.txt

.... # lots of other commands

...结果为空temp_file.txt(在OSX cat temp_file.txt上没有返回任何内容,而在Linux上它仍能正常工作)。

我对错误所做的研究都没有引出任何有用/有用的信息,但它似乎是OSX上的常见问题。我在我的bash脚本中尝试了许多其他使用awk的公式(在网上很多地方发布),但到目前为止,没有一个在两个系统上都有效。此外,我无法访问gawk,因为我在Mac上没有管理(sudo)权限。

那么,关于如何在bash脚本中转换这些文件并让它在两个系统上都能运行的任何其他想法?我想避免更改原始文件。谢谢!

(对不起,如果我遗漏了一些明显的东西。我之前没有使用awk。)

input_tabs.txt(固定宽度输入文件)如下所示:

Zyxw:
abcdef(ghijklm = no.pqrs(tuvwx.yzab$cdefghi) ~ jklmn.opqr$stu[[vwxy$zabcdefg]],      hijklmnopqrs = tuvw$xyz_abcdefghijkl) 

Abcde fghij klmnopqrstuv (wxyza bc defg)

                                Ab CdefGhIjk  LmnoPqr S.Tuvwx      Y1 Za(>B)   
cdefg.hijk$lmn[[opqr$stuvwxyz]]  2   3.45678 9.012345  6.7890 0.12345  6.789 **
Abcdefghi                       12   3.45678 9.012345         6.78901          
Jklmn                           23   4.56789                  0.12345          
---
Opqrst.uvwxyz:  6 ‘***’ 7.890 ‘**’ 1.23 ‘*’ 4.56 ‘.’ 7.8 ‘ ’ 9

input_spaces.txt(以空格分隔的输入文件)如下所示:

Firsth eade S Econdhead T-hirdh Fourth he aderishereee
UVWXYZ 0.1234 5.678 901

1 个答案:

答案 0 :(得分:0)

这不是一个答案,但Comment方法不允许合理的格式化,所以请不要因为试图帮助而向我投票。

这两个文件似乎在我的Mac OSX Mavericks上使用标准awk处理得很好,如下所示:

awk 'BEGIN{ FS=" "; OFS="\t";}{print $1,$2,$3,$4,$5,$6,$7,$8}' space| cat -vet

Firsth^Ieade^IS^IEcondhead^IT-hirdh^IFourth^Ihe^Iaderishereee$
UVWXYZ^I0.1234^I5.678^I901^I^I^I^I$

和固定宽度文件

awk 'BEGIN{ FIELDWIDTHS = "32 3 10 9 8 8 9"; OFS="\t";}{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14}' tab | cat -vet
Zyxw:^I^I^I^I^I^I^I^I^I^I^I^I^I$
abcdef(ghijklm = no.pqrs(tuvwx.y^Izab^I$cdefghi) ^I~ jklmn.o^Ipqr$stu[^I[vwxy$za^Ibcdefg]],^I^I^I^I^I^I^I$
^I^I^I^I^I^I^I^I^I^I^I^I^I$
Abcde fghij klmnopqrstuv (wxyza ^Ibc ^Idefg)^I^I^I^I^I^I^I^I^I^I^I$
^I^I^I^I^I^I^I^I^I^I^I^I^I$
                                ^IAb ^ICdefGhIjk ^I LmnoPqr ^IS.Tuvwx ^I     Y1 ^IZa(>B)   ^I^I^I^I^I^I^I$
cdefg.hijk$lmn[[opqr$stuvwxyz]] ^I 2 ^I  3.45678 ^I9.012345 ^I 6.7890 ^I0.12345 ^I 6.789 **^I^I^I^I^I^I^I$
Abcdefghi                       ^I12 ^I  3.45678 ^I9.012345 ^I        ^I6.78901 ^I         ^I^I^I^I^I^I^I$
Jklmn                           ^I23 ^I  4.56789 ^I         ^I        ^I0.12345 ^I         ^I^I^I^I^I^I^I$
---^I^I^I^I^I^I^I^I^I^I^I^I^I$