我正在尝试通过脚本传递带有一些名称的 flatdb,以便忽略某些字段并检查其他字段。目前这是我得到的。
为了忽略注释和空格行,我将在 then 语句中使用什么?
编辑:正在读取的文件示例
Bob,Brown,Smith,39
#Alex,Jay,Jones,83
Justin,Michael,White,18
James,Paul,Weis,54
Run Code Online (Sandbox Code Playgroud)
编辑:然后我将每个名字分开
IFS_SAVE=${IFS}
IFS=,
while read value1 value2 value3 value4
do
echo "First name ${value1}"
echo "Middle name ${value2}"
echo "Last name ${value3}"
echo "Age ${value4}"
done < ${1}
Run Code Online (Sandbox Code Playgroud)
然后我试图忽略文件中的空行
while read value1 value2 value3 value4
do
if [ -z ${value1} ]
then
echo "blank line exists"
fi
done < ${1}
Run Code Online (Sandbox Code Playgroud)
然后我尝试忽略文件中的注释行
while read value1 value2 value3 value4
do
if [ "${value1:0:1}" = "#" ]
then
echo "comment exists"
fi
done < ${1}
Run Code Online (Sandbox Code Playgroud)
从这里开始,我一直无法让它真正起作用
我正在尝试检查字段是否以空格开头或结尾
while read value1 value2 value3 value4
do
if [[ ${value1} = *[[:space:]]* ]]
then
echo "space exist"
fi
done < ${1}
Run Code Online (Sandbox Code Playgroud)
编辑:理想输出
First name Bob
Middle name Brown
Last name Smith
Age 39
First name Justin
Middle name Michael
Last name White
Age 39
James,Paul,Wise,54 space exist
Run Code Online (Sandbox Code Playgroud)
使用文本处理工具来处理文本,而不是数百次调用不适当的工具,例如read
或echo
在循环中。
在这里,处理表格数据的明显方法是awk
:
awk -F, -v OFS='\n' '
! /^[#[:space:]]/ {
print "First name " $1, \
"Middle name " $2, \
"Last name " $3, \
"Age " $4
}' < you-file
Run Code Online (Sandbox Code Playgroud)
在! /^[#[:space:]]/
条件上线不(匹配!
)开始(^
)用#
或空白字符。您还/^[^#[:space:]]/
可以匹配以除空格#
或空格以外的字符开头的行,这实际上也会跳过空行或添加&& NF == 4
以跳过不完全包含 4 个字段的行。
或者像预期的输出一样传递带有前导或尾随空白的行:
awk -F, -v OFS='\n' '
/^[[:space:]]/ || /[[:space:]]$/ {print; next}
/^[^#]/ && NF == 4 {
print "First name " $1, \
"Middle name " $2, \
"Last name " $3, \
"Age " $4
}' < you-file
Run Code Online (Sandbox Code Playgroud)
(这里,我们假设一个符合 POSIX 的 awk
; 用mawk
,替换[:space:]
为您希望在开始时找到的硬编码空白字符列表,因为mawk
不支持 POSIX 字符类)。
还要注意回车符(又名 CR \r
// ^M
)被认为是一个[:space:]
字符。如果输入文件是来自 Microsoft 操作系统的文本文件,其中行分隔符是 CRLF 而不是 Unix 中的 LF,那么每行将以空格字符结尾。您希望首先运行该文件dos2unix
以将其转换为 Unix 格式。