Используйте bash для вырезания строк в одном файле до длины, явно указанной в другом файле - PullRequest
1 голос
/ 05 марта 2019

У меня есть один файл, который представляет собой список чисел, и другой файл (такое же количество строк), в котором мне нужно, чтобы длина каждой строки соответствовала номеру строки в другом файле.Например:

файл 1:

5
8
7
11
15

файл 2:

abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

вывод:

abcde
abcdefgh
abcdefg
abcdefghijk
abcdefghijklmno

Я пытался использовать awkи вырезать вместе, но я продолжаю получать ошибку «роковая: попытка использовать массив` line 'в скалярном контексте ».Я не уверен, как еще пойти об этом.Любое руководство высоко ценится!

Ответы [ 4 ]

3 голосов
/ 05 марта 2019

awk, вероятно, более уместно, но вы также можете сделать:

while read line <&3; do 
    read len <&4; echo "${line:0:$len}"; 
done 3< file2 4< file1
2 голосов
/ 05 марта 2019

еще awk

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

abcde
abcdefgh
abcdefg
abcdefghijk
abcdefghijklmno
2 голосов
/ 05 марта 2019

awk - ваш инструмент для этого: один из

# read all the lengths, then process file2
awk 'NR == FNR {len[NR] = $1; next} {print substr($0, 1, len[FNR])}' file1 file2
# fetch a line from file1 whilst processing file2
awk '{getline len < lenfile; print substr($0, 1, len)}' lenfile=file1 file2
0 голосов
/ 06 марта 2019

Использование 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

$
...