파일에 특정 단어 추가

파일에 특정 단어 추가

이 코드를 사용하여 이름이 같고 폴더(list.txt에 포함된 폴더 이름)에 포함된 파일에서 행 번호 2를 읽습니다.

#!/bin/bash
in=/au/cl/tr/129/
inlist=/1/2/3
g=/1/5/file.txt

for i in $(cat $inlist/list.txt); do
 echo ${i}
 sed '2q;d' ${in}/${i}/${g};
 done > newfile.txt

이 코드의 출력(newfile.txt의 내용)은 다음과 같습니다.

 folder 1  
 a 
 folder 2
 b
 folder 3
 c
 .
 .
 .
 .

a, b, c는 파일의 두 번째 줄 값입니다.

폴더 이름(list.txt에 포함됨) "i"를 코드 출력에 추가하여 아래와 같이 2번째 줄의 값과 같은 줄의 폴더 이름을 얻으려면 어떻게 해야 합니까?

 folder1 (a) 
 folder2 (b)
 folder3 (c)
   .
   .
   .
   .

답변1

#!/bin/bash
in=/au/cl/tr/129/
inlist=/1/2/3
g=/1/5/file.txt

for i in $(cat $inlist/list.txt); do
 echo -n "$i ("
 sed '2q;d' ${in}/${i}/${g};
 echo ")"
done > newfile.txt

-n 스위치는 echo에게 개행 문자를 인쇄하지 않도록 지시합니다. 인용하다:http://wiki.bash-hackers.org/commands/buildin/echo

답변2

에서 이 작업을 수행할 필요가 없다면 sedPerl이 도움을 줄 수 있습니다. 읽고 있는 파일의 이름을 특수 변수에 저장 $ARGV하고 행 번호를 특수 변수에 저장하므로 $.다음과 같이 작동합니다.

...
for i in $(cat $inlist/list.txt); do
    perl -nle 'print "$ARGV ($_)" and last if ($.==2)' "${in}/${i}/${g}"
done

여러 행을 가져오려면 다음을 수행하세요.

...
for i in $(cat $inlist/list.txt); do
    perl -nle '
        BEGIN{
            @lines = (2,3,5);
            print "$ARGV: "
        }
        print "Line $.: $_" if grep { $. == $_ } @lines;
        last if $. == $lines[-1];
    ' "${in}/${i}/${g}"
done

위의 내용은 2, 3, 5행을 인쇄합니다. 이는 배열의 마지막 항목이 @lines인쇄하려는 마지막 줄이라고 가정합니다.

관련 정보