如何在while逐行读取时提取前两列并传入整行至程序?
解决逐行处理文件并传递整行的问题
方法一:读取整行后拆分列(推荐,兼容任意列数)
这种方式先保存整行内容,再提取需要的列,避免列数变化导致的问题:
while read -r full_line; do # 提取制表符分隔的前两列 col1=$(printf "%s" "$full_line" | cut -f1) col2=$(printf "%s" "$full_line" | cut -f2) # 打印前两列 echo "$col1:$col2" # 将整行作为输入传给program,-表示从标准输入读取 printf "%s\n" "$full_line" | program -I - done < file.txt
方法二:直接读取所有列并拼接
如果确定文件固定为4列,可以直接读取每一列,再用制表符拼接还原整行:
while read -r col1 col2 col3 col4; do echo "$col1:$col2" # 用printf输出制表符分隔的整行,避免echo转义兼容性问题 printf "%s\t%s\t%s\t%s\n" "$col1" "$col2" "$col3" "$col4" | program -I - done < file.txt
原代码的问题说明
- 原
read -r a b c仅定义三个变量,第四列会被合并到c中,$d变量不存在,导致拼接时内容缺失; echo $a"\t"$b中,echo默认不解析转义字符\t,会直接输出字符串\t而非制表符;- 变量未加双引号,当列内容包含空格或特殊字符时,会被shell拆分破坏格式。
内容的提问来源于stack exchange,提问作者gusa10
相关产品推荐
相关产品推荐

