2

编辑:已修复。现在关注优化代码。

我正在编写一个脚本来将一个文件中的数据分成多个文件。当我运行脚本时,我收到错误:“sed: -e expression #1, char 2: unknown command: `.'” 没有任何行号,这使得调试有点困难。我已经检查了我单独使用 sed 的行,它们可以正常工作。有任何想法吗?我意识到有很多事情我做了一些非常规的事情,并且有更快的方法来做一些事情(我确信有一种方法可以避免不断导入某个文件),但现在我只是想了解这一点错误。这是代码:

x1=$(sed -n '1p' < somefile | cut -f1)
y1=$(sed -n '1p' < somefile | cut -f2)
p='p'
for i in 1..$(seq 1 $(cat "somefile" | wc -l)) 
do
  x2=$(sed -n $i$p < somefile | cut -f1)
  y2=$(sed -n $i$p < somefile | cut -f1)
  if [ "$x1" = "$x2" ] && [ "$y1" = "$y2" ];
  then
    x1=$x2
    y1=$x2
  fi
  s="$(sed -n $i$p < somefile | cut -f3) $(sed -n $i$p < somefile | cut$
  echo $s >> "$x1-$y1.txt"
done
4

2 回答 2

1

The problem is in the following line:

for i in 1..$(seq 1 $(cat "somefile" | wc -l)) 

If somefile were to have 3 lines, then this would result in following values of i:

1..1
2
3

Clearly, something like sed -n 1..1p < filename would result in the error you are observing: sed: -e expression #1, char 2: unknown command: '.'

You rather want:

for i in $(seq 1 $(cat "somefile" | wc -l)) 
于 2013-06-04T18:03:00.967 回答
1

这是问题的原因:

for i in 1..$(seq 1 $(cat "somefile" | wc -l))

试一试

for i in $(seq 1 $(wc -l < somefile))

但是,您正在使用所有这些 sed 命令多次读取文件。只读一次:

read x1 y1 < <(sed 1q somefile)
while read x2 y2 f3 f4; do
    if [[ $x1 = $x2 && $y1 = $y2 ]]; then
        x1=$x2
        y1=$x2
    fi
    echo "$f3 $f4"
done < somefile > "$x1-$y1.txt"

构造s变量的行被截断——我假设每行有 4 个字段。

注意:剪切和粘贴编码的一个问题是您引入了错误:您分配y2了与x2

于 2013-06-04T18:02:09.107 回答