Sed 我应该使用cut还是awk来提取字段和字段子字符串?

Sed 我应该使用cut还是awk来提取字段和字段子字符串?,sed,awk,field,cut,text-parsing,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

我有一个带有管道分隔字段的文件。我想打印字段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
我知道这相当简单,但我不知道如何组合
awk
cut
命令


任何建议都将不胜感激。

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

awk -F'|' '{print substr($1,1,6),$2}' OFS='|' inputfile
对于您的输入,它将产生:

ABCDEF|99
JIDVES|8
DDFEXF|73

使用
sed
,您可以说:

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

生成相同的输出。

我喜欢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

编辑:(移走那只无用的猫)谢谢

另一个变体是:
awk-F\\\\\\vOFS=\\\\\\'{print$1,$2}'t.in | cut-c1-6,11-

此外,正如tripleee所指出的,两次剪切也可以做到这一点:
cut-c1-6,11-t.in | cut-d\|-f1,2
您可以使用剪切粘贴,但是您必须读取文件两次,如果文件非常大,这是一件大事:

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

粘贴-d'|',或者如果您可以猜测第二个字段的最大长度,请使用两个剪切<代码>切口-c1-6,11-16 t.in |切口-d'|'-f1-2
+1;稍微短一些:<代码> AWK-F′′{Fas$`} FS $ 2 }‘输入文件< /代码>如果短是重要的:<代码> AWK-F′{ 0美元=SUBL($1,1,6)FS $ 2 } 1′/代码>谢谢。-“1”(不是1美元)在这方面意味着什么?@ USSR386154,您可以认为它等同于代码> Prime< /Cord>。@ Jotne为什么甚至要麻烦括号和<代码> 1 < /代码>。code>awk-F\|'$0=substr($1,1,6)FS$2'就足够了<代码>;)