Bash 用空白列逐行读取TSV文件

Bash 用空白列逐行读取TSV文件,bash,quoting,Bash,Quoting,我试图逐行读取TSV(制表符分隔)文件并处理某些列。当一列为空时,此代码将失败,因为它将剩余的列偏移1。如何使read正确处理空白列 input_file="day1.ale" while IFS=$'\t' read Name Tracks Start End Take Tape UNC FPS Reel Scene do echo $FPS done < $input_file input\u file=“day1.ale” 当IFS=$'\t'读取名称跟踪开始结束录制磁带UNC F

我试图逐行读取TSV(制表符分隔)文件并处理某些列。当一列为空时,此代码将失败,因为它将剩余的列偏移1。如何使
read
正确处理空白列

input_file="day1.ale"
while IFS=$'\t' read Name Tracks Start End Take Tape UNC FPS Reel Scene
do
echo $FPS
done < $input_file
input\u file=“day1.ale”
当IFS=$'\t'读取名称跟踪开始结束录制磁带UNC FPS卷盘场景时
做
echo$FPS
完成<$input\u文件
以下是指向示例文件的链接:


我应该提到我正在使用MacOS Sierra,如果这有什么不同的话。

我已经想出了如何回答我自己的问题,比如:

input_file="day1.ale"
input_data=$(cat $input_file | tr \\11 \\7) # replace tabs with alarm bell
while IFS=$'\a' read Name Tracks Start End Take Tape UNC FPS Reel Scene
do
echo $FPS
done <<< "$input_data"
input\u file=“day1.ale”
输入数据=$(cat$输入文件| tr\\11\\7)#用警铃替换选项卡
当IFS=$'\a'读取名称跟踪开始结束录制磁带UNC FPS卷盘场景时
做
echo$FPS

完成我想出了如何回答我自己的问题,如下所示:

input_file="day1.ale"
input_data=$(cat $input_file | tr \\11 \\7) # replace tabs with alarm bell
while IFS=$'\a' read Name Tracks Start End Take Tape UNC FPS Reel Scene
do
echo $FPS
done <<< "$input_data"
input\u file=“day1.ale”
输入数据=$(cat$输入文件| tr\\11\\7)#用警铃替换选项卡
当IFS=$'\a'读取名称跟踪开始结束录制磁带UNC FPS卷盘场景时
做
echo$FPS

你知道吗,
day1.ale
有DOS
CRLF
行结尾?我没想过,但我不明白为什么在这种情况下这会有什么关系。除了文件大小之外,它不应该影响使用
IFS='\t'
的读取,但我发现它真的很奇怪。我阅读并转储了两个版本(原始版本和一个通过
dos2unix
运行的版本),至少在Linux上,
read
只是吐出
CRLF
,但我不知道mac,因为mac(OSX之前)用于行尾的
CR
。还要注意,您的标题行在双
CRLF
CRLF
(例如,
000000 E0 53 4f 4c 56 45 5f 53 49 5a 49 4e 47 09 0d 0a 0d |求解大小…
000000 F0 0a
您知道
day1.ale
有DOS
CRLF
行结束吗?我没有想过,但我不明白为什么在这种情况下这会比文件大小重要,它不应该影响
IFS=”的读取\t“
,但我发现这很奇怪。我读了两个版本(原始版本和一个通过
dos2unix
运行的版本),并且至少在Linux上,
read
只是吐出
CRLF
,但我不知道mac,因为mac(OSX之前)使用
CR
作为行尾…还请注意,在双
CRLF
CRLF
之前的
选项卡中,您的标题行尾是
000000 E0 53 4f 4c 56 45 5f 53 49 5a 49 4e 47 09 0d 0a 0d |
000000 F0 0a