Bash 腳本重複一行中的每個單字?

Bash 腳本重複一行中的每個單字?

我有一個像這樣的字串:dog cat bird whale

我想得到dog dog cat cat bird bird whale whale

所有的字都在同一行。任何想法?

答案1

新增至解決方案系列:-)。

duplicator.sh:

for i; do echo -n "$i $i "; done; echo

使其可執行,現在:

$ ./duplicator.sh dog cat bird whale
dog dog cat cat bird bird whale whale

或作為 shell 函數,例如可以在腳本中重複使用:

duplicator() {
    for i; do echo -n "$i $i "; done; echo
}

然後可以直接運行,定義為

duplicator dog cat bird whale

答案2

你可以使用sed

sed -r 's/(\S+)/\1 \1/g' filename

如果您想就地儲存文件的更改,請說:

sed -i -r 's/(\S+)/\1 \1/g' filename

您也可以使用perl

perl -M5.10.0 -ne 'say join " ", map{$_, $_} split " ";' filename

(新增將-i變更儲存到文件中的選項。)

或者,按照建議特登:

perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;' filename

引用自perlvar:

@F

此陣列@F包含開啟自動分割模式時讀取的每一行的欄位。有關開關,請參閱 perlrun -a。該數組是特定於包的,如果在strict 'vars'.

答案3

如果沒有答案,這會是什麼awk/gawk

$ awk '{ for(i=1;i<=NF+1;i+=1/2) { printf("%s ",$i); }}' <<<"dog cat bird whale"
dog dog cat cat bird bird whale whale 

如果終止換行符號很重要:

$ awk '{ for(i=1;i<=NF+1;i+=1/2) { printf("%s ",$i); }} END{print ""}' <<<"dog cat bird whale"

答案4

如果您的字串位於 a 變數中,例如foo="dog cat bird whale",您可以這樣做:

  • 純bash:

    $ echo "$foo" | (read a b c d && echo "$a $a $b $b $c $c $d $d")
    dog dog cat cat bird bird whale whale
    

    解釋:需要括號,以便readecho發生在同一個子 shell 中,因此可以共享變數。沒有它們,echo只會列印一個空白行。

  • 核心工具:

    $ join -j 5 -o 1.1,1.1,1.2,1.2,1.3,1.3,1.4,1.4 <(echo $foo) <(echo)
    dog dog cat cat bird bird whale whale
    

    解釋:-o的標誌可讓join您設定輸出格式。在這裡,我告訴它要列印第一個檔案的第一個欄位 ( 1.1),然後列印第一個檔案的第二個欄位 ( 1.2) 等。然而,join旨在加入公共欄位上的輸入行。所以,我也給它傳遞了一個空白行(<(echo)),然後忽略它。設定-j連接字段,將其設為不存在的字段(第五個)會導致join列印整行。

    如果您不關心空格或輸入順序,您可以這樣做

    $ paste <(echo $foo) <(echo $foo)
    dog cat bird wale   dog cat bird wale
    
  • 珀爾1:

    $ echo $foo | perl -lane 'push @k, $_,$_ for @F; print "@k"'
    dog dog cat cat bird bird whale whale
    

    解釋:

    -l: adds a newline to each print call (among other things)
    -a: turns on field splitting, fields are saved as @F
    -n: process input line by line
    -e: give a script as a command line parameter.
    

    上面的腳本將@F在數組中保存每個字段(來自 )兩次@k,然後列印@k。如果您不需要尾隨換行符,您可以簡化為

    $ echo $foo | perl -ane 'print " $_ $_" for @F'
    
  • 珀爾2:

    $ echo $foo | perl -0040 -pne 'print "$_"' | paste - - 
    dog dog cat cat bird bird whale whale
    

    解釋:-0選項設定輸入記錄分隔符號(作為十六進位或八進制數,請參閱這裡用於轉換)。在這裡,我將其設為八進制,040即一個空格。使列印每個輸入“行”,並且由於我們已將記錄分隔符號設為空格,-p所以perl行現在由空格定義,因此每個欄位都會列印兩次。

  • awk:

    $ echo $foo | awk '{for(i=1;i<=NF;i++){$i=$i" "$i;} 1;}'
    dog dog cat cat bird bird whale whale
    

    解釋: NF是字段的數量,因此上面的腳本會遍歷每個字段並將其附加到自身。完成後,我們列印該行(1;只是 print 的簡寫)。

相關內容