将某些单词添加到文件中

将某些单词添加到文件中

我使用此代码从具有相同名称并包含在文件夹中的文件中读取行号 2(list.txt 中包含的这些文件夹的名称):

#!/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/builtin/echo

答案2

如果您不必在 中执行此操作sed,Perl 可以提供帮助。它将正在读取的文件的名称存储在特殊变量中$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是您要打印的最后一行。

相关内容