grep word from column并删除行

时间:2016-01-01 06:02:27

标签: shell unix

我希望grep来自文件特定列的单词。然后删除那些将所有剩余行放入另一个文件的行。 任何人都可以帮我shell命令获得以下输出?

我有一个这种格式的文件:

1234     8976     897561234   1234  678901234
5678     5678     123456789   4567  123456790
1234     1234     087664566   4567  678990000
1223     6586     212134344   8906  123456789

我想要写一句话" 1234"仅在第二列中单独删除这些行并将剩余的行放在另一个文件中。因此输出应采用以下格式:

1234     8976     897561234   1234  678901234
5678     5678     123456789   4567  123456790
1223     6586     212134344   8906  123456789

out应该是3行,除了4行中的3行。

while read value ;do
  grep -v  ${value:0:10} /tmp/lakshmi.txt > /tmp/output.txt
  cp /tmp/output.txt /tmp/no_post1.txt
done < /tmp/priya.txt

你能帮我修改一下这个脚本吗?

4 个答案:

答案 0 :(得分:0)

如果这对您有好处,可以使用awk

awk '$2==1234' <file-name>

$2代表第二列,它将返回以下行:

1234     1234     087664566   4567  678990000

然后,您可以使用sedgrep -v甚至awk进行进一步处理,从当前文件中删除此行,或仅打印与其他文件不匹配的行。 awk会更容易和更强大。

答案 1 :(得分:0)

尝试以下正则表达式。

egrep -v "^[[:space:]]*[^[:space:]]+[[:space:]]+1234[[:space:]]+.*$"

不确定您的意图是什么,但我最好的猜测是您要执行以下操作。

while read value ;do
  egrep -v "^[[:space:]]*[^[:space:]]+[[:space:]]+${value:0:10}[[:space:]]+.*$" /tmp/lakshmi.txt > /tmp/output.txt
  cp /tmp/output.txt /tmp/no_post1.txt
done < /tmp/priya.txt

答案 2 :(得分:0)

对于柱状数据,awk通常是最好的工具。

从表面上看,如果您的输入数据位于priya.txt并且您想要输出lakshmi.txt,那么这可以完成这项任务:

awk '$2==1234 { next } { print }' priya.txt > lakshmi.txt

第一个模式在第2列中检测到1234(以及01234和0001234),并执行跳过脚本其余部分的next。脚本的其余部分打印输入数据;人们经常使用1代替{ print },这样可以减少冗长(或不太清楚)的效果。

如果您希望在另一个文件中使用1234的行(例如filtered.out),那么您可以使用:

awk '$2==1234 { print > "filtered.out"; next } { print }' priya.txt > lakshmi.txt

如果列必须正好1234而不是在数字上等于1234,那么您将改为使用regx匹配:

awk '$2 ~ /^1234$/ { next } { print }' priya.txt > lakshmi.txt

awk的好处在于它会自动将数据拆分为字段,这通常可以轻松地使用awk处理列数据。您也可以使用Perl或Python或其他类似的脚本语言来完成相同的工作。

答案 3 :(得分:0)

您没有准确指定记录布局。当空的第一个字段被4个空格替换时,聪明的解决方案将失败。一个领域内有空间吗? 当您的字段具有固定的偏移量时,您可能需要检查偏移量:

grep -v "^.\{9\}1234"

当/tmp/priya.txt超过1行时,你的while循环会变得难看:

cp /tmp/lakshmi.txt /tmp/output.txt
while read value ;do
  grep -v "^.\{9\}${value}" /tmp/output.txt > /tmp/output2.txt
  mv /tmp/output2.txt /tmp/output.txt
done < /tmp/priya.txt

您也可以使用grep:

的-f选项
echo "1234     8976     897561234   1234  678901234
5678     5678     123456789   4567  123456790
1234     1234     087664566   4567  678990000
1223     6586     212134344   8906  123456789" |grep -vf <(sed 's/^/^.\\{9\\}/' /tmp/priya.txt )

或在你的情况下

grep -vf <(sed 's/^/^.\\{9\\}/' /tmp/priya.txt ) /tmp/lakshmi.txt