我应该使用cut或awk来提取字段和字段子串吗?

时间:2014-04-01 17:26:21

标签: sed awk field cut text-parsing

我有一个带管道分隔字段的文件。我想打印字段1的子集和字段2的全部:

cat tmpfile.txt

# 10 chars.|variable length num|text
ABCDEFGHIJ|99|U|HOMEWORK
JIDVESDFXW|8|C|CHORES
DDFEXFEWEW|73|B|AFTER-HOURS

我希望输出看起来像这样:

# 6 chars.|variable length num
ABCDEF|99
JIDVES|8
DDFEXF|73

我知道如何获得田地1& 2:

cat tmpfile.txt | awk '{FS="|"} {print $1"|"$2}'

并且知道如何获得字段1的前6个字符:

cat tmpfile.txt | cut -c 1-6

我知道这很简单,但我无法弄清楚如何组合awkcut命令。

任何建议都将不胜感激。

4 个答案:

答案 0 :(得分:14)

您可以使用awk。使用substr()功能修剪第一个字段:

awk -F'|' '{print substr($1,1,6),$2}' OFS='|' inputfile

为了您的输入,它会产生:

ABCDEF|99
JIDVES|8
DDFEXF|73

使用sed,您可以说:

sed -r 's/^(.{6})[^|]*([|][^|]*).*/\1\2/' inputfile

产生相同的输出。

答案 1 :(得分:3)

可以使用剪切和粘贴,但是你必须读取文件两次,如果文件非常大,这是一个大问题:

paste -d '|' <(cut -c 1-6 tmpfile.txt ) <(cut -d '|' -f2 tmpfile.txt )

答案 2 :(得分:2)

仅用于另一种变体:awk -F\| -vOFS=\| '{print $1,$2}' t.in | cut -c 1-6,11-

此外,正如三人指出的那样,两次削减也可以做到这一点:cut -c 1-6,11- t.in | cut -d\| -f 1,2

答案 3 :(得分:0)

我喜欢cut和sed的组合,但这只是一个偏好:

cut -f1-2 -d"|" tmpfile.txt|sed 's/\([A-Z]\{6\}\)[A-Z]\{4\}/\1/g'

结果:

# 10-digits|variable length num
ABCDEF|99
JIDVES|8
DDFEXF|73

编辑:(删除了无用的猫)谢谢!