0

シェル スクリプトを使用して、txt ファイルの n 行目を取得する必要があります。

私のテキストファイルは

abc
xyz

2行目を取得して変数に格納する必要があります

次のようなコマンドを使用してすべての組み合わせを試しました:

  1. シード
  2. おかしい
  3. しっぽ

...など

問題は、スクリプトが端末から呼び出されると、これらのコマンドがすべて正常に機能することです。しかし、Java ファイルから同じシェル スクリプトを呼び出すと、これらのコマンドが機能しません。

非対話型シェルと関係があると思います。

助けてください

PS : read コマンドを使用すると、最初の行を変数に格納できます。

read -r i<edit.txt

ここで、「i」は変数で、edit.txt は私の txt ファイルです。

しかし、2行目を取得する方法がわかりません。

前もって感謝します

edit : また、これらの「機能しない」コマンドを使用すると、スクリプトが終了し、残りのコマンドは実行されません。

すでにコマンドを試しました:

i=`awk 'N==2' edit.txt`
i=$(tail -n 1 edit.txt)
i=$(cat edit.txt | awk 'N==2')
i=$(grep "x" edit.txt)

ジャバコード:

try
    {
        ProcessBuilder pb = new ProcessBuilder("./myScript.sh",someParam);

        pb.environment().put("PATH", "OtherPath");

        Process p = pb.start(); 

        InputStreamReader isr = new InputStreamReader(p.getInputStream());
        BufferedReader br = new BufferedReader(isr);

        String line ;
        while((line = br.readLine()) != null)
           System.out.println(line);

        int exitVal = p.waitFor();
    }catch(Exception e)
    {  e.printStackTrace();  }
}

myscript.sh

read -r i<edit.txt
echo "session is : "$i    #this prints abc, as required.

resFile=$(echo `sed -n '2p' edit.txt`)    #this ans other similar commands donot do anything. 
echo "file path is : "$resFile
4

2 に答える 2

3

ファイルから n 番目の行を出力する効率的な方法 (特に大きなファイルに適しています):

sed '2q;d' file

この sed コマンドは、ファイルを最後まで読み取るのではなく、2 行目を出力した直後に終了します。

これを変数に格納するには:

line=$(sed '2q;d' file)

または、行番号に変数を使用:

n=2
line=$(sed $n'q;d' file)

アップデート:

Java コード:

try {
    ProcessBuilder pb = new ProcessBuilder("/bin/bash", "/full/path/of/myScript.sh" );
    Process pr = pb.start(); 
    InputStreamReader isr = new InputStreamReader(pr.getInputStream());
    BufferedReader br = new BufferedReader(isr);
    String line;
    while((line = br.readLine()) != null)
        System.out.println(line);
    int exitVal = pr.waitFor();
    System.out.println("exitVal: " + exitVal);
} catch(Exception e) {  e.printStackTrace();  }

シェルスクリプト:

f=$(dirname $0)/edit.txt
read -r i < "$f"
echo "session is: $i"

echo -n "file path is: "
sed '2q;d' "$f"
于 2013-12-19T07:02:47.247 に答える