我有一个包含三列的文件
12345678910 14567855858855 12345678510750078
我想使用 sed 或 awk 仅考虑第三列的前 10 位数字。
预期输出为:
1234567851
请帮忙
答案1
您可以尝试:
awk '{ print $3; }' subject.txt | sed -n 's/\([0-9]\{10\}\).*/\1/p'
答案2
这sed命令将为您提供最后一列的前 10 位数字。
您的问题对于前 10 位数字还是后 14 位数字有点混乱,:-)
但您可以根据此示例进行同样的调整。
$ echo "12345678910 14567855858855 12345678510750078" \
| sed -n 's/.*\s\([0-9]\{10\}\)[0-9]*$/\1/ p'
1234567851
解释命令(以便您可以根据需要进行修改)。
sed -n 's/.*\s\([0-9]\{10\}\)[0-9]*$/\1/ p'
| | | | | | | | | ^ print what remains on the matched line
| | | | | | | | ^^ replace the line with the part of interest
| | | | | | | ^^^^^^^ match for the last column
| | | | | | ^^ mark the end of part we want to print
| | | | | ^^^^^^^^^^^ this will match 10 digits at the start of the last column
| | | | ^^ start marking the part we want to print
| | | ^ start matching the digits after a white-space char
| | ^^ pattern begins matching everything up to the part of interest
| ^ process only lines that match the given pattern
^^ do not print the original input string
您可以针对您的数据对此进行微调。
目前,由于[0-9]*$
此规则中的部分内容,您的数据在最后一列之后或内部不应有空格或非数字字符。
更新您的评论。
虽然此示例使用单行回显来演示您的测试用例,但
您可以按如下方式对整个文件触发该命令,
cat input-file.txt | <sed-command-above> > output-file.txt
或者
<sed-command-above> input-file.txt > output-file.txt
第一种形式显示了将如何echo
对整个多行文件起作用。
您还可以使用管道将 sed 命令进行简短测试,head input-file.txt
以查看它如何对输入文件的前 10 行起作用。
答案3
Perl 来救援:
perl -lne 'print /(\d{10})\d*$/' < filename
-n
逐行读取输入-l
在输出中添加换行符$
匹配行尾,则捕获行尾前任何其他数字的前 10 位数字,并/.../
在所施加的列表上下文中print
返回
答案4
如果你只想要 sed 解决方案,请尝试:
cat /tmp/textfile | sed -n -e '$!d;s/.*\s\([0-9]\{10\}\)[0-9]*$/\1/ p'
替代只在最后一行起作用。