读取文件并使用bash程序将每行拆分为两个变量

时间:2016-01-14 15:16:21

标签: bash ubuntu

我有一个程序在命令行中读取两个单词:

#!/bin/bash

if [[ "$1" != "" && "$2" != "" ]]; then
    java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer "$1" "$2"
else
    java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer
fi

我将此代码替换为逐行读取文件,这是我必须阅读的文件示例:

vehicle car
computer program
volley ball

代码读取每一行并将每个单词影响到一个变量,问题出在每一行的拆分过程中,因此它对$ var1和$ var2的相同单词有影响

#!/bin/bash

while read ligne
do
var1=$(echo $ligne | cut -f1 -d-)
var2=$(echo $ligne | cut -f2 -d-)

if [[ "$var1" != "" && "$var2" != "" ]]; then
    java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer "$var1" "$var2"
else
    java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer
fi
done < mm.txt

但是新代码没有给出结果

2 个答案:

答案 0 :(得分:2)

您可以使用read读取两个变量。它们由任何IFS字符分隔,默认为空格和制表符(和换行符,但无论如何read停在那里)。

while read -r var1 var2; do
    if [[ "$var1" != "" && "$var2" != "" ]]; then
        java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer "$var1" "$var2"
    else
        java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer
    fi
done < mm.txt

要读取的-r开关阻止它解析反斜杠转义,这通常是不合需要的行为。

答案 1 :(得分:1)

以下是调试程序的方法:

#!/bin/bash

while read ligne
do
var1=$(echo $ligne | cut -f1 -d' ')
var2=$(echo $ligne | cut -f2 -d' ')

if [[ "$var1" != "" && "$var2" != "" ]]; then
    echo "$var1" '|' "$var2"
    #java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer "$var1" "$var2"
else
    echo "Vars Not Found"
    #java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer
fi
done < mm.txt

运行此命令会提供以下输出:

vehicle car | vehicle car
computer program | computer program
volley ball | volley ball

这意味着您的cut命令不正确。您有几个选项可以解决它:

  1. 使用多变量read作为user3035772指出。这不太灵活,因为它依赖于$IFS的分隔符,你暗示不同意这一点。
  2. mm.txt中的分隔符修复为-,因为-d-命令的cut标志需要: vehicle-car computer-program volley-ball
  3. 修复cut命令以要求mm.txt cut -f1 -d' '中的空格分隔符。