ファイルに特定の単語を追加する

ファイルに特定の単語を追加する

このコードを使用して、同じ名前のフォルダ(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はファイルの2行目の値です。

フォルダ名(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印刷したい最後の行であると仮定します。

関連情報