Единственная ошибка в том, что вы пропустили опцию «-n» в последней строке. Это работает так, как вы ожидали.
sort -nr $filename | head -n $howmany
Используйте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
». См. здесь .
Возможно, чтобы расширить ваши попытки 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
А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, в данном случае