Unix:基于列值选择行-此for语句有什么错?
我对bash命令非常陌生,我正在尝试创建一个for语句,将第6列(以空格分隔)中值为3的每一行打印到一个文件中。我的语法如下所示:Unix:基于列值选择行-此for语句有什么错?,unix,for-loop,Unix,For Loop,我对bash命令非常陌生,我正在尝试创建一个for语句,将第6列(以空格分隔)中值为3的每一行打印到一个文件中。我的语法如下所示: for i in `cat test` do section=`echo ${i} | cut -d ' ' -f 6` line=`echo ${i}` if [ ${section} == "3" ]; then echo ${line} > test.out fi done 不幸的是,这不起作用。。。有谁能告诉我这有什么问题吗?您读取文件的方式不对 您
for i in `cat test`
do
section=`echo ${i} | cut -d ' ' -f 6`
line=`echo ${i}`
if [ ${section} == "3" ];
then
echo ${line} > test.out
fi
done
不幸的是,这不起作用。。。有谁能告诉我这有什么问题吗?您读取文件的方式不对 您可以通过以下方式进行调试:
for i in `cat file.txt`
echo $i
done
您将看到它在新行上打印每个单词,因为for循环实际上是迭代文件中的每个单词,而不是每行
要逐行读取文件,请使用以下命令:
while IFS= read -r line
do
echo "$line"
done < file.txt
你没有以正确的方式读取文件 您可以通过以下方式进行调试:
for i in `cat file.txt`
echo $i
done
您将看到它在新行上打印每个单词,因为for循环实际上是迭代文件中的每个单词,而不是每行
要逐行读取文件,请使用以下命令:
while IFS= read -r line
do
echo "$line"
done < file.txt
主要问题实际上是
`cat`
您实际上是在读取整个文件,然后将其输入到``操作符中,该操作符在空格上拆分。所以,您不是在处理行:您在处理shell定义的“单词”,一次一个
相反,尝试以下方法:
( while read line ; do
section=`echo ${line} | cut -d ' ' -f 6`;
if [ "${section}" == "3" ]; then
echo ${line} > test.out;
fi
done ) < test
(读行时;执行
section=`echo${line}|cut-d'-f6`;
如果[“${section}”==“3”];则
echo${line}>test.out;
fi
完成)<测试
主要问题实际上是
`cat`
您实际上是在读取整个文件,然后将其输入到``操作符中,该操作符在空格上拆分。所以,您不是在处理行:您在处理shell定义的“单词”,一次一个
相反,尝试以下方法:
( while read line ; do
section=`echo ${line} | cut -d ' ' -f 6`;
if [ "${section}" == "3" ]; then
echo ${line} > test.out;
fi
done ) < test
(读行时;执行
section=`echo${line}|cut-d'-f6`;
如果[“${section}”==“3”];则
echo${line}>test.out;
fi
完成)<测试
那一行太棒了。谢谢因此,我尝试对for语句中的多个值(生成多个文件)执行此操作,但是如果我用与for语句不同的变量替换3,则for语句无法识别“$6==”3“,如:“$6==”${I}”。为什么这不起作用呢?“
将阻止Bash的变量被插值(${i}
);使用“
将允许它们进入,但是您必须使用类似Awk“\$6==$i”test>test.out的东西来保护Awk$
不受shell的影响(`保护$`不受“
内部shell的影响),这一行程序非常棒。谢谢因此,我尝试对for语句中的多个值(生成多个文件)执行此操作,但是如果我用与for语句不同的变量替换3,则for语句无法识别“$6==”3“,如:“$6==”${I}”。为什么这不起作用呢?“
将阻止Bash的变量被插值(${i}
);使用“
将允许它们进入,但是您必须使用类似Awk“\$6==$i”test>test.out的东西来保护Awk$
不受shell的影响。
(`保护$`不受内部shell的影响)
)