什么定义了 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
效率高 很多 写的行。
我正在查看这个问题: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
效率高 很多 写的行。