Unix:基于列值选择行-此for语句有什么错?

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 不幸的是,这不起作用。。。有谁能告诉我这有什么问题吗?您读取文件的方式不对 您

我对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 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的影响)