2013-12-19 12 views
0

쉘 스크립트를 사용하여 txt 파일의 n 번째 줄을 가져와야합니다.비대화 형 쉘 스크립트를 사용하여 텍스트 파일의 n 번째 줄 가져 오기

  1. 가 나오지 : 나는 같은 명령을 사용하여 모든 조합을 시도했습니다 2 라인을 가져오고 변수

    에 저장해야

    abc 
    xyz 
    

    처럼

    내 텍스트 파일입니다

  2. awk
  3. 헤드
  4. 꼬리
  5. 고양이

... 등

문제는 스크립트가 터미널에서, 모든 명령은 잘 작동 호출 할 때입니다. 하지만 내 자바 파일에서 동일한 셸 스크립트를 호출하면 이러한 명령이 작동하지 않습니다.

나는 그것이 비대화 형 쉘과 관련이 있다고 예상한다.

PS 도와주세요 : 읽기 명령을 사용하여 내가 변수에 첫 선을 저장할 수 있어요.

read -r i<edit.txt 

여기에서 "i"는 변수이고 edit.txt는 내 txt 파일입니다.

하지만 두 번째 줄을 얻는 방법을 알아낼 수 없습니다. 사전에

감사

편집 : 나는이 "비 작업"명령을 사용할 때 또한 스크립트, 종료, 그리고 나머지 명령 중 어느 것도 실행되지 않습니다.

이미 시도 명령 :

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 
+0

가능한 이중 : http://stackoverflow.com/questions/6022384/bash-tool-to-get-nth-line-from-a-file – SuperSaiyan

+0

나는 그의 명령을 시험해 본 결과, 터미널에서 잘 작동한다. . 하지만 자바 프로그램에서 스크립트를 호출 할 때가 아닙니다. – Singh

답변

2

에 특히 적합 파일에서 n 번째 라인을 인쇄하는 효율적인 방법 (대용량 파일) :

sed '2q;d' file 

이 sed 명령은 끝까지 파일을 읽지 않고 두 번째 줄을 인쇄 한 직후 종료됩니다.

변수에이를 저장하려면

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

또는 라인 번호 변수 사용 :

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

UPDATE :

자바 코드 :

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" 
+0

은 터미널에서 작동하지만 같은 스크립트가 Java 프로그램에 의해 호출 될 때 – Singh

+0

Java 코드를 질문에 게시 할 수 있습니까? – anubhava

+0

이 코드 스 니펫 – Singh

0

이 시도 :

tail -n+X file.txt | head -1 

를 X는 라인 번호입니다 : 4 라인

tail -n+4 file.txt | head -1 

.

+0

또한 짧은 버전이 가능합니다. tail -2 file.txt | head -1 그리고 출력을 가져 와서 변수에 저장하십시오 : line = \'tail -2 file.txt | head -1 \' –

+0

은 터미널에서 작동하지만 같은 스크립트가 java 프로그램에 의해 호출되는 경우에는 작동하지 않습니다. – Singh