我想在一个内部循环中创建一个内部循环,其中包含从bash脚本中的ascii文件读取的字符串。我有两个包含字符串列表的输入ascii文件:
files.txt:
filename1
filename2
polls.txt:
CO
NOx
SOx
我使用了IFS,内容如下:
while IFS= read -r file; do
printf '%s\n' "$file"
while IFS= read -r poll; do
printf '%s\n' "$poll"
ogrinfo $Database_maindir/$file".shp" -sql "ALTER TABLE $file ADD COLUMN $poll float"
done < "$Database_maindir/polls.txt"
done < "$Database_maindir/files.txt"
我得到以下打印和错误:
CO
CO
FAILURE:
Unable to open datasource `/home/CO.shp' with the following drivers.
它仅读取“ polls.txt”字符串。
正确的输出应为:
filename1
CO
ogrinfo /home/"filename1.shp" -sql "ALTER TABLE filename1 ADD COLUMN CO float"
NOx
ogrinfo /home/"filename1.shp" -sql "ALTER TABLE filename1 ADD COLUMN NOx float"
Sox
ogrinfo /home/"filename1.shp" -sql "ALTER TABLE filename1 ADD COLUMN Sox float"
filename2
CO
ogrinfo /home/"filename2.shp" -sql "ALTER TABLE filename2 ADD COLUMN CO float"
NOx
ogrinfo /home/"filename2.shp" -sql "ALTER TABLE filename2 ADD COLUMN NOx float"
Sox
ogrinfo /home/"filename2.shp" -sql "ALTER TABLE filename2 ADD COLUMN Sox float"
因此,对于每个文件(例如filename1,filename2),我想执行COMMAND(例如ogrinfo命令,该命令将更新文件的列,而这些列是polls.txt中列出的不同污染物。
在第一个循环中,我想从files.txt中读取字符串,并将字符串$ file保留为字符串名称(例如filename1)。在第二个循环中,我想从“ polls.txt”中读取字符串,并保留字符串$ poll(例如CO)。
但是,似乎在第一个循环中,它从找到的第一个文件中读取了字符串,即“ polls.txt”,因此$ file给出了字符串“ CO”。
我如何定义第一个循环应读取第二个txt文件?
答案 0 :(得分:0)
也许您可以尝试使用awk:
awk '
NR == FNR {
a[$0]
next
}
{
for ( i in a )
printf( "system ogringo %s %s\n" , $0 , i )
}
' polls.txt files.txt
我对sql一无所知,但也许每个文件只能有一个命令。
答案 1 :(得分:0)
read
从正确的流中读取。而且循环内的命令也不会从流中读取。
while IFS= read -r -u 3 file; do
printf '%s\n' "$file"
while IFS= read -r -u 4 poll; do
printf '%s\n' "$poll"
echo ogrinfo $Database_maindir/$file".shp" -sql "ALTER TABLE $file ADD COLUMN $poll float"
done 4< "$Database_maindir/polls.txt"
done 3< "$Database_maindir/files.txt"
paste <(
awk -v nr=$(wc -l <polls.txt) \
'{for (i = 1; i <= nr; i++) print}' files.txt
) <(
seq $(wc -l <files.txt) |
xargs -n1 cat polls.txt
) |
xargs -n2 sh -c 'echo ogrinfo "$1".shp -sql "ALTER TANLE $1 ADD COLUMN $2 float"' --