在循环中使用head命令时出错

时间:2014-05-22 16:31:25

标签: linux bash awk head

我正在尝试编写一个脚本,该脚本将从文件中取两个字段(由'。'分隔)并交换它们并将它们插入另一个文件中。该程序将用于n个记录。下面给出了脚本

#!/bin/ksh
k=`wc -l file1|cut -d' ' -f1`
i=1
while [ $i -le $k ]
do
    var1=`awk 'BEGIN {FS = "."};{print $2}' file1|head -$i|tail -1`
    var2=`awk 'BEGIN {FS = "."};{print $1}' file1|head -$i|tail -1`
    c="$var1.$var2"
    echo $c >> results.txt
    i=$i+1
done

我在head命令中收到以下错误。你能帮帮我吗?

head:无法识别的选项-+' Try head --help'了解更多信息。

4 个答案:

答案 0 :(得分:3)

您编写的内容只需一个awk命令就可以处理:

awk 'BEGIN {FS=OFS="."} {print $2, $1 > "resultst.txt"}' file1

答案 1 :(得分:3)

原因是第i=$i+1行将i转换为1+1,然后转换为1+1+1,依此类推。

为什么不使用:

awk 'BEGIN {FS="."};{print $2"."$1}' <file1 >results.txt

答案 2 :(得分:1)

我怀疑你的shell并不完全清楚你的意思:

i=$i+1

因此i获得值+或类似值。尝试使用expr(查看您的手册页)

顺便说一句 - 你的方法是完全错误的,整个事情应该是一个简洁,琐碎的awk脚本。

答案 3 :(得分:0)

这个sed会起到作用:

sed -e 's/\(.*\)\.\(.*\)/\2.\1/' file1 > results.txt

它匹配由点分隔的两个子表达式,然后交换引用。请注意,在左侧,您必须转义点,否则它将被解释为正则表达式的一部分,而右侧则不需要。