![重击](https://linux22.com/image/106913/%E9%87%8D%E5%87%BB.png)
我有一个管道(|)分隔的字符串,我需要找到该管道分隔字符串的第七列中的第一个字符
AAAAAA|04|XXXXXXX|20170210-163119|||2.0|20170208||
预期输出:2
答案1
您还可以使用剪切:
cut -d\| -f7 | cut -c1
答案2
这将完成这项工作:
awk -F "|" '{print(substr($7,1,1))}' input.file.txt
答案3
重击
IFS='|' read -r -a x <<< "$str"
echo "${x[7]:0:1}"
read
命令使用 $str 的内容并将它们拆分为 charpipe |
并将它们填充到名为 x 的数组 ( -a
) 中。然后我们从第 7 个字段的开头提取一个字符。
珀尔
perl -F'\|' -pale '($_) = $F[6] =~ /./g' <<< "$str"
-F
=> 字段分隔符,-p
=> 自动打印模式,-a
=> 打开自动分割, => 将记录分隔符( )-l
设置为和。RS
\n
ORS
\n
第 7 个字段$F[6]
在列表上下文中进行评估,并/./g
返回单个字符,其中第一个字符被挑选并存储在$_
which 由于autoprint
将把它带到stdout
。
表达式
sep='|'
fld="[^$sep]*"
fld7=$(yes "$fld$sep" | sed 7q | tr -d '\n')
expr "$str" : "$fld7\(.\)"
在这里,我们构建了命令,以便expr
完成它的工作under the hood
。
echo "$fld"; # => [^|]*
echo "$fld7"; # => [^|]*[^|]*
....7次
答案4
去研究有趣的sed行为
sed 's/\(\([^|]\?\)[^|]*|\)\{7\}.*/\2/' input.file.txt
或者减少逃逸
sed -r 's/(([^|]?)[^|]*\|){7}.*/\2/' input.file.txt
或避免正则表达式
sed '/\n/{s/./\n/2;P;d;};s/|/\n/6;s/$/\n/;D' input.file.txt