根据unix中的列值删除行

时间:2014-02-09 18:33:02

标签: bash shell unix

我需要从固定长度的文件中剪切线条并将其粘贴到新文件中,以便以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"

代码结束

**输出开始**

180AP997270518423 N03212013

**输出结束** 在上面的输出中,空格丢失了。我希望我的输出具有与输入行相似的间距。字母“N”在我的输入文件中位于35,其中输出为19。

if部分将输出写入文件但是我丢失了格式。我需要保留原始格式,因为此脚本的输出是另一个大型机程序的输入。

请提供建议。

2 个答案:

答案 0 :(得分:2)

假设语句“位置35为N”且“第二个字段以N开头”是等效的,您可以使用awk命令

awk '$1 ~ /^180/ && $2 ~ /^N/ {
       print $0 > "online_error.txt";
       next;
     }
     { print $0 > "online_good.txt" }' "$file"

答案 1 :(得分:1)

您可以考虑以下替代方案:

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 -v '^180.* N' < b.txt > newFile.txt