在一行中打印每个单词的第一个字母

时间:2015-02-17 04:57:56

标签: bash awk sed

我搜索了其他帖子,但未找到符合我需求的答案。我有一个空格分隔的文件。我想打印给定行中每个单词的第一个字母。例如:

cat test.txt
This is a test sentence.

使用sed,awk或组合,我希望输出为" Tiats"。有关指导我朝正确方向发展的建议吗?

11 个答案:

答案 0 :(得分:4)

一种可能性:

pax> echo 'This is a test sentence.
  This is another.' | sed -e 's/$/ /' -e 's/\([^ ]\)[^ ]* /\1/g' -e 's/^ *//'
Tiats
Tia

第一个sed命令只是确保每行末尾有一个空格来简化第二个命令。

第二个命令将从每个单词中删除所有后续字母和尾随空格。这个意义上的一个词被定义为任何一组非空格字符。

第三个是添加的东西,以确保每行上的前导空格被删除。

答案 1 :(得分:4)

sed 的另一种解决方案:

sed 's/\(.\)[^ ]* */\1/g' File

在此,我们会查找any character.),然后是sequence of non-space characters[^ ]*),然后是optional space*)。将此模式替换为first字符(与.匹配的字符)。

<强>示例:

$ cat File
This is a test sentence.
Ahggsh Mathsh Dansdjksj
$ sed 's/\(.\)[^ ]* */\1/g' File
Tiats
AMD

答案 2 :(得分:2)

在awk中:

awk '{
  for (i=1; i<=NF; i++) {
    printf(substr($i, 1, 1));
  }
  printf("\n");
}' input_file

awk自动将NF设置为行中的字段数,循环遍历每个字段并使用substr获取第一个字母

答案 3 :(得分:1)

一个有趣的纯Bash解决方案:

while read -r line; do
    read -r -d '' -a ary <<< "$line"
    printf '%c' "${ary[@]}" $'\n'
done < text.txt

答案 4 :(得分:0)

使用perl:

$ echo This is a test sentence | perl -nE 'print for /^\w|(?<=\W)./g'
Tiats

说明:打印任何非空白字符,该字符位于该行的开头,或以空格开头。

答案 5 :(得分:0)

另一个perl命令。

$ echo 'This is a test sentence.' | perl -nE 'print for m/(?<!\S)\S/g;print "\n"'
Tiats

答案 6 :(得分:0)

另一个awk

awk '{for (i=1;i<=NF;i++) $i=substr($i,1,1)}1' OFS= file

除了第一个字母之外,它会遍历每个单词并切除所有单词。

X:

cat file
This is a test sentence.
Ahggsh Mathsh Dansdjksj

awk '{for (i=1;i<=NF;i++) $i=substr($i,1,1)}1' OFS= file
Tiats
AMD

答案 7 :(得分:0)

sed 's/ *\([^ ]\)[^ ]\{1,\} */\1/g' YourFile

直接占据所有空间长度和位置。假设只是空格是空格字符而不是标签(但可以很容易地适应)

只是为了好玩

sed 's/ *\(\([^ ]\)\)\{1,\} */\2/g' YourFile

取最后一个字母而不是第一个字母

答案 8 :(得分:0)

在Haskell中,在一行:

main = putStr =<< (unlines . map (map head . words) . lines <$> getContents)

也许更可读:

main = do
  line <- getLine  --Read a single line from stdin
  let allWords = words line --Turn the line into a list of words
  let firsts = map head allWords --Get the first letter of each word
  putStrLn firsts --Print them out
  main --Start over

答案 9 :(得分:0)

这可能适合你(GNU sed):

sed 's/\B.\|[[:space:][:punct:]]//g' file

删除单词,空格和标点符号开头后的所有字符。

答案 10 :(得分:0)

啊,在我找到这个线程之前,任务非常艰巨。 ...我想提取一串单词中的第一个字母。这有效:

echo 'Apple banana Carrot fruit-cake (Grapes)' | sed -r 's/.*/\L&/; s/-/ /g; s/[()]//g; s/(.)[^ ]* */\1/g'
abcfcg

sed -r 's/.*/\L&/; s/-/ /g; s/[()]//g; s/(.)[^ ]* */\1/g'
  • \L& 将字符串小写(要大写,请使用:\U&
  • 用空格替换 -
  • 去掉括号 ()
  • 这里其他答案的最后一个表达,特别是@arjun-mathew-dan
    • 查找任何字符:(.)
    • 后跟一系列非空格字符:[^ ]*
    • 后跟可选空格: *
    • 将此模式替换为第一个字符 [由 (.) 匹配]:\1