2013-06-18 3 views
0

다음 행의 첫 번째 열과 행의 마지막 열을 결합하고 싶습니다. 예를 들어awk - 다음 행의 첫 번째 열과 마지막 열을 결합하십시오.

cat FILE 
12 15 
22 25 
32 35 
42 45 

이렇게 가입하도록

15 22 
25 32 
35 42 

15 (마지막 칼럼)의 22 (다음 행의 첫 번째 열)에 결합했다.

내 해결책은 다음과 같습니다. tr '\n' '@' < FILE | tr '\t' '\n' | grep '@' | grep -v '@$' | tr '@' '\t' 그러나 간단한 awk 명령이있을 수 있습니다.

+0

'12 '(첫 번째 행)와 '45'(마지막 행)의 위치는 어디입니까? – fedorqui

+0

그들은 그걸로 합류 할 것이 없으므로 버려집니다 (이것이 왜'grep -v '@ $''를 사용하고있는 겁니다). – PoGibas

답변

3
awk '{ 
    for (i = 2; i < NF; i += 2) 
    print $i, $(i + 1) 
    }' RS= OFS=\\t infile 

bash는 으로 :

a=($(<infile));printf '%s\t%s\n' ${a[@]:1:${#a[@]}-2} 

zsh을 으로 :

printf '%s\t%s\n' ${$(<infile):1:-1} 
+0

'RS ='함수 란 무엇입니까? – PoGibas

+0

RS = 레코드 구분 기호를 빈 문자열로 설정합니다. 이 경우 샘플 데이터가 주어지면 전체 파일이 하나의 레코드로 간주됩니다. –

3

알 수 있습니다. 탭으로서

$ awk 'BEGIN{OFS="\t"}{if (NR==1) {a=$2} else {print a,$1;a=$2}}' file 
15  22 
25  32 
35  42 
  • 'BEGIN{OFS="\t"} 셋트 파일 분리기.
  • {if (NR==1) {a=$2}은 첫 번째 줄에 두 번째 필드 만 저장합니다.
  • else {print a,$1;a=$2}}은 이전 행의 두 번째 필드와 현재의 첫 번째 필드를 인쇄합니다. 이렇게하면 마지막 레코드가 인쇄되지 않습니다.
+0

열 탭을 구분할 수 있습니까? '$ 1 "\ t"$ 2'이 (가) 오류를 보였습니다. 그리고 OFS는 여기서도 작동하지 않습니다. – PoGibas

+0

이제 완전히 끝났습니다.'BEGIN'의'OFS' 옵션을보십시오. – fedorqui

2

Dimitre Radoulov이 솔루션을하지만 우리는 골프를하는 경우 :

awk '$1=$NF=X;1' RS= file|xargs -n2 
15 22 
25 32 
35 42 
0
awk 'NR!=1{print $1,p} {p=$2}' 
관련 문제