У меня есть несколько файлов, содержащих содержание как следующее:
File 1
NC_12548 og789 |nd784 -2 -54 -6
NC_12548 og789 |nd784 -2 -54 -6
NC_12548 og789 |nd784 -2 -54 -6
File2
NC_54456 og789 |nd784 -5 -56 -6
NC_98123 og859 |nd784 -5 -84 -5
NC_689.1 og456 |nd784 -5 -54 +8
File3
NC_54456 og789 |nd784 -5 -56 -6
NC_98123 og859 |nd784 -5 -84 -5
NC_689.1 og456 |nd784 -5 -54 +8
Я хочу сохранить единственные первые два столбца (NC_12345 og855) и отдых отбрасывания его. Как я могу сделать это?
С awk
можно просто использовать |
как разделитель столбцов и печать первый столбец:
awk -F '|' '{print $1}' file1.txt file2.txt file3.txt
вывод будет связан. Если необходимо сохранить произведенным в отдельных файлах, рассмотрите использование для цикла в оболочке вокруг awk
# assuming they're all in the same directory, hence `*`
for fname in ./file*.txt ; do
# add extension to current file in "$fname" variable indicate new file
# > does the actual redirection
awk -F '|' '{print $1}' "$fname" > "$fname".new
done
Наличие нового вывода в .new
могло бы быть желательным для резервного копирования. Иначе мы можем использовать sed -i
выполнить замену в файле. Выполните его без -i
сначала для контрольного испытания
# use file*.txt if they're all in the current directory
sed -i 's/|.*$//' file1.txt file2.txt file3.txt
sed -i 's/\(^.*\)|.*/\1/g' file1.txt file2.txt file3.txt
Другая опция с помощью Python:
#!/usr/bin/env python3
import sys
for fname in sys.argv:
with open(fname) as fd_read, open(fname+'.new','w') as fd_write:
for line in fd_read:
fd_write.write(line.split('|')[0] + '\n')
Этот сценарий предназначается, чтобы использоваться как ./script.py file1.txt file2.txt file3.txt
и запишет вывод в новые файлы с .new
расширение
Для включения некоторого текста я всегда думаю cut
во-первых, разделение |
как в комментарии jno:
cut -d\| -f1 file
Или похоже, что формат является всегда 8 символами, затем 2 пробелов, затем еще 5 символов, таким образом, Вы могли просто сократить первые 15 символов с
cut -c 1-15 file
Или Вы могли разделить поля пробелами, но так как существует два пробелов между первыми и вторыми полями, который означает, что Вы отключили поля 1, 2, и 3:
cut -d" " -f 1-3 file
Сокращение не имеет в распоряжении файл, редактирующий как sed
, но можно произвести в новый файл, затем отодвинуться исходный файл, например
for file in {file1,file2,file3}
do
cut -d" " -f 1-3 "$file" > "$file.2"
mv "$file.2" "$file"
done
Я undestand отбрасывают отдых его, чтобы означать, что должны быть пропущены пустые строки.
Perl: (добавьте -i
отредактировать исходные файлы)
perl -lnE 'say $1 if /(.*) \|/' file*
sed: (добавьте -i
отредактировать исходные файлы)
sed 's/ \|//;/^$/d' file*
AWK: (добавьте -i inplace
отредактировать исходные файлы)
awk 'NF {print $1" "$2}' file*