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

What defines a "column" in bash? In awk?

我正在查看这个问题:Bash - Take nth column in a text file

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

列的定义是什么?它只是一个 space 分隔符吗?是标签吗?

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

cat "$DATE $ID $ADDRESS \n" > myfile.data

如果我们谈论 awk,那么 space 字符是默认的列分隔符。

awk解析一个文件awk '{FS=",";print }'时,更改用作"Field Separator"(FS)的内容很容易。将使用逗号作为分隔符(注意:不尊重引号和类似 csv 解析器的内容)。

要写入文件,我会使用 echo 和双胡萝卜 >>

>> 追加而 > 重写文件。 echo -e 会让 echo 识别 \n 和类似的特殊字符

所以命令是

echo -e "$DATE $ID $ADDRESS \n" >> myfile.data

如果您要使用 awk,各列由 字段分隔符 分隔。有关详细信息,请参阅 man awk 中的 FS

大多数工具都支持一些更改列分隔符的方法:

cut -f
sort -t

bash 本身使用 IFS 变量(内部字段分隔符)进行分词。

cat 等待文件作为参数。要输出字符串,请改用 echo

bash中,与awk相反,列在IFS.

中由字符分隔

也就是说,如果你设置:

IFS=$'\t'

...然后列,正如 bash 内置函数(例如 read first second rest 所理解的那样,将由制表符分隔。在输出端,printf '%s\n' "${array[*]}" 将打印数组 array 中的项目,由 IFS.

的第一个字符分隔

IFS 的默认值等同于 $' \t\n' -- 即 space、制表符和换行符。


要用您选择的分隔符编写一个文件,并且(大概)不止一行(将 while read 替换为您实际获取数据的方式,或者只使用循环内部如果你只写一行):

while read -r date id address; do
  printf '%s\t' "$date" "$id" "$address" >&3; printf '\n' >&3
done 3>filename

...或者,如果您不想要上面留下的尾随制表符:

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

3>filename 放在循环外部 比每行 >>filename 效率高 很多 写的行。