从文本文件中剪切第2列


15

我的文本文件没有分隔符来指定分隔符而只是空格,我如何切出第2列以输出文件,

39    207  City and County of San Francisc   REJECTED          MAT = 0
78    412  Cases and materials on corporat   REJECTED          MAT = 0
82    431  The preparation of contracts an   REJECTED          MAT = 0

所以我需要的输出是

207
412
432

Answers:


13

最简单的方法awk是将多个连续的空格视为一个空格,因此

awk '{print $2}' file

版画

207
412
431

但是显然有很多其他工具可以完成这项工作,即使这些工具不是针对以下任务而设计的grep

grep -Po '^[^ ]+[ ]+\K[^ ]+' file

6

使用管道将您的数据(例如,cat columns.txt)发送到剪切中。

cat columns.txt | cut -d" " -f5

在您提供的示例数据中,单个空格定界符将所需的数据放在字段5中。要将输出发送到另一个文件,请使用重定向。

cat collumns.txt | cut -d" " -f5 > field2.txt

使用awk命令,您可以执行以下操作,该操作会自动识别出您要查找的字段,因为那里有数据(?),我需要了解有关awk的更多信息。

awk -F' ' '{print $2}' columns.txt

3
这种感染cat ... |很少是必要的。多数Unix命令都cut将一个或多个输入文件作为参数,例如cut -d" " -f5 columns.txt
丹尼斯·豪

1

正如@jimmij所说,这awk '{print $2}' file是最简单的答案。

如果由于某种原因您不想使用awk并且坚持使用cut,则可以在管道切割之前sed将两个或多个空格的每个实例转换为一个选项卡(cut默认分隔符):

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431

0

您仍然可以使用单个空格作为定界符,只是会有更多的列。将您提供的值cut -d' ' -f从2增加到5,或者也许是6。增加数字,直到获得所需的结果。


0
grep -Po '^[^ ]+[ ]+\K[^ ]+' file

如果您要在像下面这样的shell脚本中更改为“ root”用户,那么当诸如awk之类的Linux实用程序无法用于数据提取时,以上一项非常有用。

sudo -i <<EOF
ps aux | grep -E -i "[l]js"  |grep -v "javaagent" | awk '{print $2}' # So awk won't work here
ps aux | grep -E -i "[l]js"  | grep -v "javaagent" | grep -Po '^[^ ]+[ ]+\K[^ ]+'
EOF

1
awk您的示例中“ 不起作用” 的唯一原因是未在此处引用本文,这意味着$2外壳程序会将其扩展到第二个位置参数。该解决方案可能不是切换到grep命令,但要么逃避$$2作为\$2或简单地通过引用整个文档<<'EOF'代替<<EOF。另请注意,示例中的任务更容易由来执行pgrep
库萨兰达

非常感谢@Kusalananda。它像魅力一样运作。
Alok Tiwari
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.