Bash 在unix中基于列值删除行
我需要从一个固定长度的文件中剪切一行(s),并将其粘贴到新文件中,以180开头且位置35有“N”的行。 我正在使用**bash**Bash 在unix中基于列值删除行,bash,shell,unix,Bash,Shell,Unix,我需要从一个固定长度的文件中剪切一行(s),并将其粘贴到新文件中,以180开头且位置35有“N”的行。 我正在使用**bash** **Sample input file:** 070000001 075PRMAGDALENA F DEL
**Sample input file:**
070000001 075PRMAGDALENA F DEL 180AP997270518411 Y02092014
180AP997270518412 N02092014
180AP997270518413 N03212013
PAYMNT
190EM037490013798700
070000002 075PRRERUCHA TROY A 195097130808020800 070000003
180AP997270518423 Y03212013
**Sample input end**
代码:
while IFS= read -r line
do
## var=$((var+1))
if [ ${line:0:3} = '180' ] && [ ${line:34:1} = 'N' ] ;
then
echo $line > online_error.txt
else
echo $line > online_good.txt
fi
done <"$file"
当IFS=read-r行时
做
##var=$((var+1))
如果[${line:0:3}='180']&&[${line:34:1}='N'];
然后
echo$line>online_error.txt
其他的
echo$line>online_good.txt
fi
你可以考虑下面的替代方案:
cat b.txt | grep -E '^180.{32}N' > newFile.txt
提取第35列中以180
开头且有N
的行;及
cat b.txt | grep -E -v '^180.{32}N' > remainder.txt
为了所有其他人
注意--E
标志是Mac OS上用于“扩展正则表达式”的标志。或者,您可以使用egrep
——这样您就不需要该标志了。我认为在其他版本的Unix中也是如此
如果您确定第二列中的字母始终是“空格后的第一个字母”,您也可以尝试
egrep '^180.* N' < b.txt > newFile.txt
egrep'^180.*N'newFile.txt
及其补充:
egrep -v '^180.* N' < b.txt > newFile.txt
egrep-v'^180.*N'newFile.txt
假设语句“位置35为N”和“第二个字段以N开头”是等效的,您可以使用awk
命令
awk '$1 ~ /^180/ && $2 ~ /^N/ {
print $0 > "online_error.txt";
next;
}
{ print $0 > "online_good.txt" }' "$file"
“我丢失了格式”是什么意思?使用echo“$line”
来保留行中的间距。echo$line,不知何故没有保留使用的间距egrep和其余部分可以正常工作,但新文件是在没有记录的情况下生成的。这很奇怪-因为-v
标志表示“所有不匹配的内容”,因此,您希望不带-v
标志的相同表达式生成其余表达式…您是否有可能输入错误?