Как заменить содержание в несколько файлов?

У меня есть несколько файлов, содержащих содержание как следующее:

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) и отдых отбрасывания его. Как я могу сделать это?

4
задан 3 March 2019 в 02:00

3 ответа

С 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 расширение

8
ответ дан 23 November 2019 в 11:40

Для включения некоторого текста я всегда думаю 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
4
ответ дан 23 November 2019 в 11:40

Я undestand отбрасывают отдых его, чтобы означать, что должны быть пропущены пустые строки.

Perl: (добавьте -i отредактировать исходные файлы)

perl -lnE 'say $1 if /(.*) \|/' file*

sed: (добавьте -i отредактировать исходные файлы)

sed 's/ \|//;/^$/d' file*

AWK: (добавьте -i inplace отредактировать исходные файлы)

awk 'NF {print $1" "$2}' file*
0
ответ дан 23 November 2019 в 11:40

Другие вопросы по тегам:

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