过滤文件并在两个文件之一中发送行

时间:2014-06-04 15:37:02

标签: unix awk sed grep ksh

我需要根据以下规则从单个文件创建两个文件: 对于输入文件的每一行,

  • 如果从位置x到位置y的字符都是空格,请在输出文件A
  • 中写入该行
  • 否则,将文件写入输出文件B

我可以在ksh中轻松地写这个,但我想知道是否有更好的方法,使用grep / sed / awk或任何其他工具。 我不是awk或sed的专家,但问题是有两个输出文件,所以我不能使用shell的流重定向。

我阅读了一些关于awk和sed的文档,但是在处理几个输出文件时却找不到任何内容。

任何想法?

以下是x = 17和y = 19的示例:

输入文件:

test.empty.field   .test
test.non.emptyfield.test

输出文件A

test.empty.field   .test

输出文件B

test.non.emptyfield.test

输入文件是csv文件,我只能使用字符数来检查值。没有分隔符。

3 个答案:

答案 0 :(得分:2)

类似的东西:

awk -v x=10 -v y=15 '{
    out = (substr($0, x, y-x+1) ~ /[^[:space:]]/) ? "B" : "A"
    print > out
}' file

答案 1 :(得分:1)

以下是awk

的使用方法
cat file
1234   89
123   789
123456789

打印到file1所有包含空格的行,从46,休息到file2

awk 'substr($0,4,3)=="   " {print > "file1";next} {print > "file2"}' file

cat file1
123   789

cat file2
1234   89
123456789

答案 2 :(得分:0)

使用sed

pat=[[:space:]] patcol=5 n=3 fileA=A fileB=B

sed -nE "
      /^.{$((patcol-1))}$pat{$n}/ w $fileA
      //!                         w $fileB
" <<EOD
1234   89
1234  789
12345  89
EOD

cat A
cat B