我有多个包含以下内容的文件:
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*