我希望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
你能帮我修改一下这个脚本吗?
答案 0 :(得分:0)
如果这对您有好处,可以使用awk
:
awk '$2==1234' <file-name>
$2
代表第二列,它将返回以下行:
1234 1234 087664566 4567 678990000
然后,您可以使用sed
,grep -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