![如何从大文件的每一行中删除最后两个“分隔字符串”](https://linux22.com/image/111761/%E5%A6%82%E4%BD%95%E4%BB%8E%E5%A4%A7%E6%96%87%E4%BB%B6%E7%9A%84%E6%AF%8F%E4%B8%80%E8%A1%8C%E4%B8%AD%E5%88%A0%E9%99%A4%E6%9C%80%E5%90%8E%E4%B8%A4%E4%B8%AA%E2%80%9C%E5%88%86%E9%9A%94%E5%AD%97%E7%AC%A6%E4%B8%B2%E2%80%9D.png)
我有许多来自源系统的 2GB 空格分隔文件。每个文件中的每一行都包含相同数量的由 " 包围的字符串作为文本限定符。
我需要从每个文件的每一行中消除最后两个字符串及其文本限定符。 (就像从柱状报告中删除最后两列一样)。对于较小的文件,我可以导入 Excel、分隔、删除列、另存为制表符分隔(比空格有用得多)。
无论如何,这些文件太大,对于 Excel 来说,行数太多。所以sed
??
"text1" "text2" "text3" "text4" "text5" "text6"
每行都有相同数量的字符串。如何从每一行中删除“text5”“text6”?
答案1
如果你知道你总是想删除最后两列,可以使用这个习惯用法:
awk 'NF-=2' file
我注意到这不适用于nawk
,不知道为什么。可移植的方法是用 `$1=$1 强制进行字段分割:
awk '{NF-=2} $1=$1' file
输出:
"text1" "text2" "text3" "text4"
答案2
此sed
命令将从文件中的每行末尾删除最后两个空格分隔的带引号的字符串infile
,并将结果发送到outfile
:
sed 's/ *"[^"]*" *"[^"]*" *$//' < infile > outfile
答案3
awk '{$(NF-1)=$NF=""}1' inp
perl -pale '$_ = "@F[0..@F-3]"' inp
sed -ne '
s/" "/"\
"/g
:a
s/\n/ /
/\n.*\n.*\n/ba
P
' inp
解释:
awk
代码将最后一个和倒数第二个字段清空并打印。- In
perl
字段存储在@F
数组中,并且slice
选择从第 0 到倒数第三个字段并将其存储在当前行中$_
。双引号用于实现数组->字符串 xformation,并通过$"
superglobal
默认值是空格的 来连接在一起。-p
Perl 选项然后将$_
值传送到标准输出。 - 我们
sed
首先转动所有模式" "
--->"\n"
然后进入一个循环,收回\n
直到还剩下两个模式。此时我们使用P
大写的 p, 命令来打印模式空间的第一部分。
答案4
打印每个字段直到 last-2..AWK 使用变量 NF 为我们提供了连续的字段数
echo "text1" "text2" "text3" "text4" "text5" "text6" | awk -v ORS="" '{
for(i=1;i<=NF-2;i++)print $i, " " ; print "\n"}'