Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在unix中基于列值删除行_Bash_Shell_Unix - Fatal编程技术网

Bash 在unix中基于列值删除行

Bash 在unix中基于列值删除行,bash,shell,unix,Bash,Shell,Unix,我需要从一个固定长度的文件中剪切一行(s),并将其粘贴到新文件中,以180开头且位置35有“N”的行。 我正在使用**bash** **Sample input file:** 070000001 075PRMAGDALENA F DEL

我需要从一个固定长度的文件中剪切一行(s),并将其粘贴到新文件中,以180开头且位置35有“N”的行。 我正在使用**bash**

**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
标志的相同表达式生成其余表达式…您是否有可能输入错误?