使用 bash 将一个文件中的行剪切为另一个文件中明确规定的长度

Use bash to cut lines in one file to lengths explicitly stated in another

我有一个文件是数字列表,还有另一个文件(行数相同),其中我需要每行的长度与另一个文件中的行数相匹配。例如:

文件 1:

5
8
7
11
15

文件 2:

abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

输出:

abcde
abcdefgh
abcdefg
abcdefghijk
abcdefghijklmno

我试过使用 awk 和 cut together 但我一直收到错误 "fatal: attempt to use array `line' in a scalar context"。我不知道还有什么办法可以解决这个问题。非常感谢任何指导!

awk 是您的工具:

之一
# read all the lengths, then process file2
awk 'NR == FNR {len[NR] = ; next} {print substr([=10=], 1, len[FNR])}' file1 file2
# fetch a line from file1 whilst processing file2
awk '{getline len < lenfile; print substr([=11=], 1, len)}' lenfile=file1 file2

awk 可能更合适,但您也可以这样做:

while read line <&3; do 
    read len <&4; echo "${line:0:$len}"; 
done 3< file2 4< file1

另一个awk

$ paste file1 file2 | awk '{print substr(,1,)}'

abcde
abcdefgh
abcdefg
abcdefghijk
abcdefghijklmno

使用 Perl

perl -lne ' BEGIN { open($f,"file1.txt");@x=<$f>;close($f) } 
             print  substr($_,0,$x[$.-1]) ' file2.txt

使用给定的输入

$ cat cmswen1.txt
5
8
7
11
15

$ cat cmswen2.txt
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

$  perl -lne ' BEGIN { open($f,"cmswen1.txt");@x=<$f>;close($f) } print  substr($_,0,$x[$.-1]) ' cmswen2.txt
abcde
abcdefgh
abcdefg
abcdefghijk
abcdefghijklmno

$