Используйте awk
. awk
использует ассоциативные массивы; вы можете построить массив с числами из select.dat
в качестве ключей и не беспокоиться о назначении каких-либо значений. Затем вы можете использовать простую проверку «___ in
» в качестве фильтра, чтобы определить, что печатать.
NR
означает «номер записи», а FNR
означает «номер записи файла». Тест FNR == NR
по существу означает: «Я все еще работаю над первым файлом?» Таким образом, следующий код создаст массив (без значений), используя строки из первого заданного файла в качестве ключей. Затем он печатает только те строки из второго файла, где второе поле находится в созданном массиве.
awk 'FNR == NR {myarray[$0]; next} $2 in myarray { print }' select.dat file.dat
Использованиеawk
:
awk '{OFS="_";}{$1=$1; print}' test.txt
Использование петли:
while read -r line; do
line=${line// /_}
command using "$line"
done<test.txt
Кто-то дал ответ с tr , а кто-то еще дал ответ с awk , теперь вот как это сделать с sed:
for i in "`cat test.txt`"
do
fn="$(echo "$i" |sed -e 's/ /_/g')"
'do something else' > $fn.txt
done
Используйте tr
для транслитерации пробела в подчеркивание:
while read line
do
echo ${line} | tr -s " " "_"
done < test.txt
Человек _разумный Mus _мускулистый Крыса _крыса _крыса
Я бы использовал sed
и прочитал его вывод с помощью цикла:
sed 's/[[:space:]]\+/_/g' test.txt | while IFS= read -r line; do
process "$line" however
done > some.output.file
Вот краткий цикл for, в котором используется sed:
for file in $(sed "s/ /_/g" test.txt); do echo "test" > $file; done
Просто замените команду echo на то, что вы хотите сделать.
Я использую такие команды постоянно, хоть и днем.