重击

重击

我有一个管道(|)分隔的字符串,我需要找到该管道分隔字符串的第七列中的第一个字符

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\nORS\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

相关内容