我有一个带管道分隔字段的文件。我想打印字段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
命令。
任何建议都将不胜感激。
答案 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
编辑:(删除了无用的猫)谢谢!