簡體   English   中英

如何從文件中的每一行的字符串中選擇第n個字符?

[英]How to select the nth char from a string for each line in a file?

每一行都有一個單詞和一個數字。 我需要以某種方式選擇第n個字母,它們將共同構成一個新詞。 例如:

and 3
for 3
map 2
wrestle 1

draw

它必須像這樣開始

cat char.txt | ...

我只允許使用sed(沒有awk,perl,...)。

我知道如何選擇所有數字

sed 's/\(.*\) \(.*\)/\2/g'

或文字

sed 's/\(.*\) \(.*\)/\1/g'

而我在考慮

cat char.txt | head -c $(sed 's/\(.*\) \(.*\)/\2/g') | tail -c 1 | sed 's/\n\//g'

但它不會起作用,因為它不會迭代思考所有的行,並且由於某種原因它甚至不會在一行上工作。

需要一些幫助和指導

while read w n; do echo -n ${w:(($n-1)):1}; done < filename

輸出:

draw

${parameter:offset:length}: 
   Substring Expansion. Expands to up to length characters of parameter
   starting at the character specified by offset.

這是一個解決這個難題的sed腳本,假設找到的數字在1-9范圍內:

s/ /@@@@@@@@@@ /
s/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).* 1$/\1/
s/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).* 2$/\2/
s/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).* 3$/\3/
s/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).* 4$/\4/
s/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).* 5$/\5/
s/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).* 6$/\6/
s/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).* 7$/\7/
s/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).* 8$/\8/
s/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\).* 9$/\9/
H
$!D
${x;s/\n//g;}

第一行用@ s填充當前行上的字,以確保字段中至少有10個字符。 9個后續行用給定位置的字符替換模式空間。 H將該字符存儲在保留空間中,前面帶有換行符。 除非讀取了最后一行,否則我們將丟棄模式空間並重新開始。 如果已經讀取了最后一行,我們將模式空間與保留空間交換,保留空間保存所需的單詞垃圾郵件,我們刪除了換行符。

將其保存在文件script.sed我們獲取

% sed -f script.sed < data
draw

實施支持1-19范圍內的字符偏移的版本的迷人練習留給讀者練習。

我們可以用awk更輕松地解決這個難題:

% awk '{answer=answer substr($1,$2,1)}END{print(answer)}' < data
draw

僅使用sed(抱歉避免使用cat char.txt: - ;

sed -n ':a
/1$/ !{
   s/.//
   h
   s/.* \([0-9]\)$/\1/
   y/98765432/87654321/
   G
   s/\(.\)\n\(.*\) [0-9]/\2 \1/
   b a
   }
s/\(.\).*/\1/p' char.txt

假設您只采用第1列到第9列(單個數字),但可以通過適應“巨大數字”進行擴展。 它也可以通過'簡單'在每行寫一個字符1 char(所以verticaly)。 也可以修改bu重載代碼。

原則:如果最后一位不是1,則刪除第一個字符並減少1.如果它等於1,則打印該行的第一個字符。

  • 測試最后一位數是/1$/
  • 減少是由翻譯y/98765432/87654321/
  • s/.//刪除第一個字符
  • 另一種是通過復制線使用工作和保持緩沖區(僅修改最后一位數部分)的演示文稿,只留下數字,減少,添加原始行並重新排列新數字代替最后一個舊數字
  • 到達digit = 1,in不進入流程並僅保留第一個字符,然后按s/\\(.\\).*/\\1/p打印s/\\(.\\).*/\\1/p

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM