Зацикливание на пронумерованных файлах и добавление к каждой строке файла содержимого другого файла с тем же номером

Единственная ошибка в том, что вы пропустили опцию «-n» в последней строке. Это работает так, как вы ожидали.

sort -nr $filename | head -n $howmany
2
09.08.2019, 13:07
3 ответа

Используйтеawk:

for f in *.csv; do
    awk '
        FNR==NR{txt=$0}
        FNR!=NR{printf "%s%s\n",$0,txt}
    ' "${f%.*}.txt" "$f" > "$f.csv.tmp" && mv "$f.csv.tmp" "$f"
done

Выход:

$ cat a.csv
line 1yyy
line 2yyy
line 3yyy

В некоторых современных реализациях awkесть опция -i inplace, поэтому вам не понадобится «часть tmp и mv». См. здесь .

1
27.01.2020, 22:02

Возможно, чтобы расширить ваши попытки Perl

for f in./*.csv; do 
  perl -i -lpe 'BEGIN{$x = shift @ARGV} s/$/$x/' "$(<"${f%.csv}.txt")" "$f"
done

(в предположении ksh/zsh/bash для оператора $(<file); замените на $(cat<file), если ваша оболочка не поддерживает его ).

давать

$ head./*.csv
==>./1.csv <==
  line 1yyy
  line 2yyy
  line 3yyy

==>./2.csv <==
  line 1zzz
  line 2zzz

Однако на самом деле вам не нужна подстановка регулярных выражений для этого -вы можете рассмотреть возможность замены s/$/$x/простой конкатенацией строк$_.= $x

2
27.01.2020, 22:02

Аsed-однострочник:

for i in 1 2 ; do sed -i "s/$/$(cat $i.txt)/" $i.csv ; done

s/$/Я заменяю конец каждой строки, таким образом добавляя к строке

$(cat $i.txt)добавить текстовый -файл, названный в честь текущего номера.

Обратите внимание, что это приведет к проблемам, если filen.txtсодержит специальные символы, такие как косая черта, обратная косая черта, кавычки и т. д.

Если это вас беспокоит, используйте разделитель записей ascii вместо /в операторе sed -. Вы можете ввести их в vim, нажав Ctrl+V, а затем ввести их десятичное значение ---030, в данном случае

0
27.01.2020, 22:02

Теги

Похожие вопросы