Bash 用空白列逐行读取TSV文件
我试图逐行读取TSV(制表符分隔)文件并处理某些列。当一列为空时,此代码将失败,因为它将剩余的列偏移1。如何使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
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
有DOSCRLF
行结尾?我没想过,但我不明白为什么在这种情况下这会有什么关系。除了文件大小之外,它不应该影响使用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
有DOSCRLF
行结束吗?我没有想过,但我不明白为什么在这种情况下这会比文件大小重要,它不应该影响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