什么定义了bash中的"列"?在awk?

far*_*d99 3 bash awk cat

我正在查看这个问题:Bash - 在文本文件中取第n列

我想创建一个写入文本文件的函数,然后我可以使用上面的方法解析它.因此,例如,我希望我的函数在第一列中写入'dates',在第二列中写'ID',在第三列中写'addresses'.然后,一旦我有这个,用户可以,例如,通过查询第二列,然后查看那里的每个项目,查看文件中是否存在某个ID.用户可以使用上述问题中讨论的方法执行此操作.

什么定义了一个列?它只是一个空格分隔符吗?它是一个标签吗?

如果我想如上所述输出这些信息,那么我写入文件的方法是什么样的?到目前为止,我有:

cat "$DATE $ID $ADDRESS \n" > myfile.data
Run Code Online (Sandbox Code Playgroud)

Cha*_*ffy 6

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每行,其每一次写入行重新打开输出文件.