我正在查看这个问题:Bash - 在文本文件中取第n列
我想创建一个写入文本文件的函数,然后我可以使用上面的方法解析它.因此,例如,我希望我的函数在第一列中写入'dates',在第二列中写'ID',在第三列中写'addresses'.然后,一旦我有这个,用户可以,例如,通过查询第二列,然后查看那里的每个项目,查看文件中是否存在某个ID.用户可以使用上述问题中讨论的方法执行此操作.
什么定义了一个列?它只是一个空格分隔符吗?它是一个标签吗?
如果我想如上所述输出这些信息,那么我写入文件的方法是什么样的?到目前为止,我有:
cat "$DATE $ID $ADDRESS \n" > myfile.data
Run Code Online (Sandbox Code Playgroud)
在bash中,与awk相反,列由字符分隔IFS.
也就是说,如果你设置:
IFS=$'\t'
Run Code Online (Sandbox Code Playgroud)
...然后由bash内置函数理解的列read first second rest将由制表符分隔.在输出端,printf '%s\n' "${array[*]}"将打印array由第一个字符分隔的数组中的项目IFS.
默认值IFS等于$' \t\n'- 即空格,制表符和换行符.
要编写一个带有您选择的分隔符的文件,并且(可能)多行(替换为while read您实际获取数据,或者仅使用循环内部,如果您只写一行):
while read -r date id address; do
printf '%s\t' "$date" "$id" "$address" >&3; printf '\n' >&3
done 3>filename
Run Code Online (Sandbox Code Playgroud)
...或者,如果您不希望上面留下的尾随标签:
IFS=$'\t' # use a tab as the field separator for output
while IFS=$' \t\n' read -r date id address; do
entry=( "$date" "$id" "$address" )
printf '%s\n' "${entry[*]}" >&3
done 3>filename
Run Code Online (Sandbox Code Playgroud)
把3>filename在环路的外面是多比更有效的>>filename每行,其每一次写入行重新打开输出文件.
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |