如何将内容替换至多个文件?

如何将内容替换至多个文件?

我有多个包含以下内容的文件:

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) 并丢弃其余部分。我该怎么做?

答案1

awk可以将其用作|列分隔符并打印第一列:

awk -F '|' '{print $1}' file1.txt file2.txt file3.txt

输出将被连接起来。如果有必要将输出保存在单独的文件中,请考虑在 shell 中使用 for 循环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名为

答案2

为了剪切一些文本,我总是首先想到用 jno 的评论cut进行分隔:|

cut -d\| -f1 file

或者看起来格式总是 8 个字符,然后是 2 个空格,然后是 5 个字符,因此你可以直接用

cut -c 1-15 file

或者您可以用空格分隔字段,但由于第一个和第二个字段之间有两个空格,这意味着您需要删去字段 1、2 和 3:

cut -d" " -f 1-3 file

Cut 没有像 那样的就地文件编辑功能sed,但你可以输出到新文件,然后移动原始文件,例如

for file in {file1,file2,file3}
do
  cut -d" " -f 1-3 "$file" > "$file.2"
  mv "$file.2" "$file"
done

答案3

我明白丢弃其余部分表示必须跳过空行。

Perl:(添加-i编辑原文件)

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

sed:(添加-i编辑原文件)

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

AWK:(添加-i inplace编辑原文件)

awk 'NF {print $1" "$2}' file*

相关内容