使用 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
$
我有一个文件是数字列表,还有另一个文件(行数相同),其中我需要每行的长度与另一个文件中的行数相匹配。例如:
文件 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
$