之后删除所有列

时间:2018-12-04 13:02:08

标签: bash awk sed

如何删除第n列之后的所有内容?

来自

My name is Chris dfgwer5hy4w5hwret
Bob is his name 41rgadfg agaojpr ge]f8098
A guy called karl gWE GWEG34YHTJ eeg452 yfg

收件人

My name is Chris
Bob is his name
A guy called karl

更喜欢是否还删除任何尾随空格。

我知道我可以使用类似的方法删除特定的列,但是我想删除第四列之后的所有内容。

sed -i -r 's/\S+//5'

谢谢, 克里斯

5 个答案:

答案 0 :(得分:3)

能否请您尝试以下步骤(在GNU awk中经过测试)。为了原位保存结果,请在以下代码后附加> temp_file && mv temp_file Input_file

awk 'NF=4'  Input_file

说明: NFawk的即用型变量,它指示当前行中的字段数(默认情况下,它认为字段分隔符作为空格),因此我根据OP的问题将其值手动设置为4。现在awk适用于模式/条件和操作的方法,因此此处未提供任何操作,因此默认情况下将打印具有已编辑字段数的当前行。

或者您也可以按照ghoti先生在评论中的提及使用以下内容。

awk '{NF=4;$1=$1}1'  Input_file

解决方案2: 现在也添加了sed解决方案。考虑到您的实际Input_file与所示示例相同。要将输出保存到Input_file本身,请对以下代码使用sed -i选项。

sed 's/\(.* is [^ ]*\)\(.*\)/\1/' Input_file

解决方案第3条: :如果您的系统在gensub的GNU中有awk,那么下面的内容可能会对您有所帮助。

awk '{reg="(.* is [^ ]*).*";print gensub(reg, "\\1", 1, $0)}'  Input_file

答案 1 :(得分:2)

任何awk:

$ awk '{sub("([[:space:]]*[^[:space:]]+){"NF-4"}[[:space:]]*$","")}1' file
My name is Chris
Bob is his name
A guy called karl

使用GNU awk,您可以进行awk -i inplace 'script' file来获得与sed -iperl -i相同的伪就地编辑,并且您可以手动在外部完全手动地完成它们在内部所做的一切仅由command 'script' file > tmp && mv tmp file命令,例如

cut -d' ' -f1-4 file > tmp && mv tmp file

答案 2 :(得分:0)

如果它在字符串之后而不是在第n列之后,则按照RavinderSingh13的假设:

cat file.txt | sed 's/^\(My name is [a-z]*\).*/\1/'

答案 3 :(得分:0)

如果您喜欢Perl,则可以使用下面的

$ cat chris.txt
My name is Chris dfgwer5hy4w5hwret
Bob is his name 41rgadfg agaojpr ge]f8098
A guy called karl gWE GWEG34YHTJ eeg452 yfg

$ perl -i -lane ' print join " ", @F[0..3] ' chris.txt

$ cat chris.txt
My name is Chris
Bob is his name
A guy called karl

$

答案 4 :(得分:0)

这可能对您有用(GNU sed):

sed -ri 's/\s+\S+//4g' file

删除第四个及更多组空白,再删除非空白,然后将编辑后的文件返回原位。