vim awk/sed:对每列重复第1列

xoefb8l8  于 2023-05-07  发布在  其他
关注(0)|答案(8)|浏览(203)

我试图将第一列追加到每列如下。
现有A B C D E F
必填项:B A C A D A E A F A
我已经对一组较小的列尝试了这种方法,如下所示;

cat file | awk '{print $2" "$1" "$3" "$1" "$4" "$1}"

50多列如何重复上述
谢了, iis 瓦

mbskvtky

mbskvtky1#

以下是另一个awk解决方案:

$ echo 'A B C D E F' | awk '{for(i=2; i<=NF; i++) $i=$i " " $1; sub(/^[^ ]+ /, "")} 1'
B A C A D A E A F A
omqzjyyz

omqzjyyz2#

这可能对你有用(GNU sed):

sed 'y/ /\n/;s/.*/echo "&" | sed "1h;1d;G"/e;y/\n/ /' file

将每个字段之间的空格转换为换行符。
使用求值替换,对原始文件中的每一行应用sed的第二次调用,并复制/删除第一个字段,然后将副本附加到每个后续字段。
最后,将所有引入的换行符转换回空格。

2hh7jdfx

2hh7jdfx3#

无循环awk

echo 'A B C D E F' |
gawk '($2 = __$2) gsub(" |$", " " $1 "&") sub(".+" __,_)^_' __='\773'
B A C A D A E A F A
  • 略短的版本,用gsub()调用换取1个额外的尾随空间 *:
mawk2 '($2 = __$2)(OFS = " "$1 " ")^!++NF sub(".+" __,_)' __='\767'

甚至更短的版本,不带尾随空格、printf、循环或END { }部分

mawk 'gsub(" $|^[^ ]+" (OFS = " "$!_ " "),_, $!++NF)^_'
B A C A D A E A F A
dauxcl2d

dauxcl2d4#

使用GNU awk且不带尾随换行符:

echo 'A B C D E F' | awk 'BEGIN{RS=OFS; ORS=""} NR==1{a=$1} NR>1{$1=$1; print s $0 OFS a; s=OFS}'

输出:

B A C A D A E A F A

参见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

91zkwejq

91zkwejq5#

如果你的awk支持多字符RS,这里有另一个awk解决方案,它不会留下前导或尾随空间:

awk -v RS='[[:blank:]]+' 'NR==1 {s=$1; next}
   {printf "%s%s %s", (NR==2?"":" "), $1, s} END {print ""}' file

B A C A D A E A F A
gr8qqesn

gr8qqesn6#

使用awk:

$ echo "A B C D E F" | awk '{for(i=2;i<=NF;i++) printf "%s", $i" "$1" "; printf "\n"}'
B A C A D A E A F A
13z8s7eq

13z8s7eq7#

如果不需要前导或尾随空格,并且如果至少有2列,则仅重复第一列的值:

awk 'NF>1{
  s=""
  for(i=2; i<=NF; i++) s=s (i==2 ? "" : OFS) $i OFS $1  
  print s
}' file

输出

B A C A D A E A F A
e5njpo68

e5njpo688#

将第二个空格替换为第一列和一个临时字符,
重复直到只剩下一个空格,
将临时字符替换为空格并将第一列移到末尾。

echo 'A B C D E F' | 
  sed -r ':a;s/([^ \r]*)[\r ]([^ ]*)( )/\1\r\2\r\1\r/;ta;s/\r/ /g; s/([^ ]*) (.*)/\2 \1/'

当输入在file中时,可以使用

sed -rf <(echo "s/[^ ]* //;";sed -r 's/([^ ]*).*/s#( |$)# \1 #g/' file) file

相关问题