Sed 我应该使用cut还是awk来提取字段和字段子字符串?
我有一个带有管道分隔字段的文件。我想打印字段1的子集和字段2的全部: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
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'就足够了<代码>;)代码>