我尝试从bash中的文件读取输入,但由于CSV中的标题行,因此想要丢弃文件的第一行。 tail -n+2 "${csv}"
单独使用,但在使用<
时出现错误:
syntax error near unexpected token `-n+2'
我尝试工作的代码是:
while IFS=, read c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 c22 c23 c24
do
description[$i]="${c3}"
current_ip[$i]="${c10}"
new_ip[$i]="${c12}"
new_netmask[$i]="${c13}"
new_gateway[$i]="${c14}"
i=$i+1
done < tail -n+2 "${csv}"
有人可以帮助提供< tail -n+2 "${csv}"
的工作表格并解释解决方案吗?
答案 0 :(得分:4)
这里简单的答案是使用process substitution:
while ... done < <(tail -n+2 "$csv")
这是有效的,因为<(tail)
被shell替换为一个文件名,该文件名通过命名管道连接到tail
的输出,或者在支持它的平台上,{{1}别名。
因此,在运行时,这将变成类似(伪代码):
/dev/fd
...或(如果尝试为POSIX sh编写此代码,或者没有类似功能的shell,则可能会执行此操作):
tail -n+2 "$csv" >/dev/fd/63 &
while ... done < /dev/fd/63
...虽然你的shell不需要用于创建FIFO的临时目录的开销,但这比使用tempdir=$(mktemp -t -d csvpipe.d.XXXXXX)
mkfifo "$tempdir/csvpipe.tmp"
tail -n+2 "$csv" >"$tempdir/csvpipe.tmp" &
while ... done <"$tempdir/csvpipe.tmp"
rm -rf "$tempdir"
更安全,并且比固定/硬编码的临时文件更安全名。
答案 1 :(得分:1)
而不是使用tail
,只需直接从文件中读取,但使用复合命令({...}
和两个read
来丢弃前两行。
{ read; read;
while IFS=, read ...; do
...
done
} < "$csv"